我有这个
preg_replace
声明,
$s = "Foo money bar";
echo preg_replace("/(office|rank|money)/i", "<strong>$1</strong>", $s);
返回,
Foo <strong>money</strong> bar
但是,当我尝试使用单引号和在
$i
上使用的函数执行完全相同的操作时,它会崩溃,
$s = "Foo money bar";
echo preg_replace("/(office|rank|money)/i", '<strong>' . ucfirst($1) . '</strong>', $s);
注意函数第二个参数中的单引号,现在产生,
syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or '{' or '$'
实例
所以我的问题是为什么会发生这种情况以及如何获得预期的输出(
ucfirst
),如第二个示例所示?
发生此问题不仅是因为函数
ucfirst
,还因为单引号,如 this 示例所示,
$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_replace
的第二个参数中使用函数。'<strong>' . ucfirst($1) . '</strong>'
在搜索之前评估。要在正则表达式替换中使用函数,您必须使用 preg_replace_callback:
$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);
这会引发同样的错误。那是因为
$1
不是一个变量,它是一个 反向引用。您可以将其称为\1
而不是$1
,这样会更清晰。
因此,您不能引用引号之外的反向引用(此外,
$1
将是非法变量名称)。我无法参考其工作原理的具体内部结构(找不到任何内容),但它可能被设置为“标志”,供解释器替换为第 n 个匹配组。
有趣的是,如果您使用函数作为第二个参数并且将反向引用用引号引起来,它仍然有效! (从某种意义上说,它不会出错。它仍然不会运行该函数。)
<?php
$s = "Foo money bar";
echo preg_replace("/(office|rank|money)/i", '<strong>' . ucfirst('$1') . '</strong>', $s); // works with single and double quotes
这篇文章没有谈论这个,但无论如何它都是一本很棒的书。