0
$so = file_get_contents(...) ;
$so = preg_replace("/\*([^*]+)\*/e", constant(\1), $so) ;

试图用同名的常量替换星号之间的文本,但我不断收到意外的 T_LNUMBER。我写错了什么?我验证了 $so 作为字符串的存在,并且所有常量都以纯文本形式存在。

我可能不会使用这个脚本,但我很好奇我在搞砸什么

4

5 回答 5

5

尝试preg_replace_callback("/\*([^*]+)\*/e", create_function('$matches','return constant($matches[1]);'), $so)

我一直怀疑php中有匿名函数,但我从来没有使用过它们。这是更好的:

preg_replace_callback("/\*([^*]+)\*/e", function($matches){
    return constant($matches[1]);
}, $so)

编辑:正如下面评论中所指出的,一旦您使用回调,就不需要 \e 修饰符,因为我们不需要评估返回值中的任何代码。

于 2012-10-16T19:54:00.700 回答
1

正确的做法是:

$so = preg_replace_callback("/\*([^*]+)\*/", function($m){return constant($m[1])}, $so);

constant(\1)在 php.ini 中没有任何意义。

于 2012-10-16T19:56:10.810 回答
0

正如您所说,您应该替换为$1,\1更好地用于反向引用,但在同一个正则表达式中。

于 2012-10-16T19:53:49.627 回答
0

问题在于如何评估代码。

该行:

preg_replace("/\*([^*]+)\*/e", constant(\1), $so) ;

应该:

$so = preg_replace("/\*([^*]+)\*/e", "constant('\\1')", $so) ;

您需要将传递给的值括constant()在引号中,以便将其视为字符串。此外,将第二个参数括在引号中,以便评估反向引用。

于 2012-10-16T19:56:37.857 回答
0

T_LNUMBER 引用您的变量。您不能命名以数字开头的变量。 php 法典

于 2012-10-16T19:57:31.650 回答