尝试preg_replace $ 1变量时,获取无效参数传递错误

时间:2017-08-22 09:05:37

标签: php preg-replace

这是我收到错误的代码:

$show_nav = preg_replace('#\{\$SUBMENU([0-9]+)\}#',implode("\n",$sub_menu['submenu$1']),$show_nav);

所以基本上我想用$ menuMav变量中的字符串替换子菜单数组中的数据{$ SUBMENU2}。我测试过,如果我手动输入这样的数字就可以了。

$show_nav = preg_replace('#\{\$SUBMENU([0-9]+)\}#',implode("\n",$sub_menu['submenu2']),$show_nav);

我还验证了正则表达式正在抓住正确的变量:

$show_nav = preg_replace('#\{\$SUBMENU([0-9]+)\}#','$1',$show_nav);

它将字符串替换为{$ SUBMENU}字符串中的内容。因此,如果它{$ SUBMENU3}它给了我3,{$ SUBMENU5}它让我回到5.但我似乎无法动态读取$ 1变量。我尝试添加大括号,仍然是同样的错误:

$show_nav = preg_replace('#\{\$SUBMENU([0-9]+)\}#',implode("\n",$sub_menu['submenu{$1}']),$show_nav);

或:

$show_nav = preg_replace('#\{\$SUBMENU([0-9]+)\}#',implode("\n",$sub_menu['{submenu$1}']),$show_nav);

我知道我错了,但无法弄清楚这样做的正确方法。有什么建议吗?

**** **** UPDATE 感谢Toto和WiktorStribiżew提供的建议,这是解决我的问题的代码,再次感谢!!!

$show_nav = preg_replace_callback(
'#\{\$SUBMENU([0-9]+)\}#',
function($m) use($sub_menu) {

if(isset($sub_menu['submenu' .$m[1]]))
                                        {
return '<ul class="nav-dropdown">' .implode("\n",$sub_menu['submenu' .$m[1]]) .'</ul>';

}

},$show_nav);

1 个答案:

答案 0 :(得分:1)

preg_replace_callback是你的朋友:

$show_nav = preg_replace_callback(
            '#\{\$SUBMENU([0-9]+)\}#',
            function($m) use($sub_menu) {
                  return implode("\n",$sub_menu['submenu'.$m[$1]])
            },
            $show_nav);