$so = file_get_contents(...) ;
$so = preg_replace("/\*([^*]+)\*/e", constant(\1), $so) ;
试图用同名的常量替换星号之间的文本,但我不断收到意外的 T_LNUMBER。我写错了什么?我验证了 $so 作为字符串的存在,并且所有常量都以纯文本形式存在。
我可能不会使用这个脚本,但我很好奇我在搞砸什么
尝试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 修饰符,因为我们不需要评估返回值中的任何代码。
正确的做法是:
$so = preg_replace_callback("/\*([^*]+)\*/", function($m){return constant($m[1])}, $so);
你constant(\1)
在 php.ini 中没有任何意义。
正如您所说,您应该替换为$1
,\1
更好地用于反向引用,但在同一个正则表达式中。
问题在于如何评估代码。
该行:
preg_replace("/\*([^*]+)\*/e", constant(\1), $so) ;
应该:
$so = preg_replace("/\*([^*]+)\*/e", "constant('\\1')", $so) ;
您需要将传递给的值括constant()
在引号中,以便将其视为字符串。此外,将第二个参数括在引号中,以便评估反向引用。
T_LNUMBER 引用您的变量。您不能命名以数字开头的变量。 php 法典