将白名单单词的第一个字母设为大写

问题描述 投票:0回答:2

我有这个

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
),如第二个示例所示?

更新#1

发生此问题不仅是因为函数

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 '$'
php regex callback preg-replace uppercase
2个回答
3
投票

不能在

preg_replace
的第二个参数中使用函数。
'<strong>' . ucfirst($1) . '</strong>'
在搜索之前评估。要在正则表达式替换中使用函数,您必须使用 preg_replace_callback:

$result = preg_replace_callback($pattern, function ($m) {
    return '<strong>' . ucfirst($m[1]) . '</strong>';
}, $yourstring);

1
投票

您收到该错误不是因为引号的类型,而是因为您在引号之外执行此操作。

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

演示

这篇文章没有谈论这个,但无论如何它都是一本很棒的书。

© www.soinside.com 2019 - 2024. All rights reserved.