Php preg_replace变量替换用单引号显示错误
我有这个Php preg_replace变量替换用单引号显示错误,php,regex,preg-replace,double-quotes,single-quotes,Php,Regex,Preg Replace,Double Quotes,Single Quotes,我有这个preg\u replace语句 $s = "Foo money bar"; echo preg_replace("/(office|rank|money)/i", "<strong>$1</strong>", $s); 注意函数的第二个参数中的单引号,这将产生 syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or '{' or '$' 现场示例 所以我的问
preg\u replace
语句
$s = "Foo money bar";
echo preg_replace("/(office|rank|money)/i", "<strong>$1</strong>", $s);
注意函数的第二个参数中的单引号,这将产生
syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or '{' or '$'
现场示例
所以我的问题是,为什么会出现这种情况,以及如何获得第二个示例中所示的预期输出(使用ucfirst
)呢
更新#1
发生此问题不仅是因为函数ucfirst
,还因为单引号,如示例所示
您不能在
preg\u replace
的第二个参数中使用函数“”。加州大学第一校区(1美元)。'“
在搜索之前进行计算。要在正则表达式替换中使用函数,必须使用preg_replace_回调:
$result = preg_replace_callback($pattern, function ($m) {
return '<strong>' . ucfirst($m[1]) . '</strong>';
}, $yourstring);
$result=preg\u replace\u回调($pattern,function($m){
返回“”.ucfirst($m[1])。”;
},$yourstring);
出现错误不是因为引号的类型,而是因为您在引号之外执行操作
echo preg_replace("/(office|rank|money)/i", "<strong>" . $1 . "</strong>", $s);
虽然没有提到这一点,但无论如何这是一本很棒的读物。那么你能解释一下单引号的问题吗?即使我删除了该函数,它仍然无法工作。@Script47:这与单引号或双引号无关。这与在
preg\u replace
的第二个参数中使用函数有关。这肯定也与单引号有关,请检查。@Script47:我已经解释了问题所在,但很抱歉我不能为您理解。如果我的回答不清楚,请随时提问。@Script47:再一次,与引号无关:$1
不是一个变量,它是捕获组的占位符。请注意,ucfirst
实际上没有对该变量调用。是的,我添加了一个说明:“它的工作原理是不会出错。它仍然不会运行该函数。”你知道如何使用它使函数调用工作,或者为什么函数调用不工作吗?这是因为第二个参数不是由PHP解释的,而是由正则表达式引擎解释的。你过去可以将e
修饰符添加到eval()
第二个参数,但现在已弃用。您唯一的选择实际上是使用preg\u replace\u callback()
。
$s = "Foo money bar";
echo preg_replace("/(office|rank|money)/i", '<strong>' . $1 . '</strong>', $s);
syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or '{' or '$'
$result = preg_replace_callback($pattern, function ($m) {
return '<strong>' . ucfirst($m[1]) . '</strong>';
}, $yourstring);
echo preg_replace("/(office|rank|money)/i", "<strong>" . $1 . "</strong>", $s);
<?php
$s = "Foo money bar";
echo preg_replace("/(office|rank|money)/i", '<strong>' . ucfirst('$1') . '</strong>', $s); // works with single and double quotes