我正在寻找eval()的替代方法来执行包含在字符串变量中的代码,并注意到preg_replace
与/e
修饰符。然而,代码的计算方式非常奇怪。
例如,echo()
在php 5.3.6中导致错误:
<?php
$code = 'echo( ''Hello, world!''.PHP_EOL)';
preg_replace('/(.*)/e', $code, '' );
?>
错误信息:
解析错误:语法错误,意外T_ECHO在/Users/…/test.php(4): regexp code on line
致命错误:preg_replace(): Failed evaluate code:
echo('Hello, world!'.PHP_EOL) in/Users/…/test.php on line 4
而print()
工作,并输出Hello, world!:
<?php
$code = 'print( ''Hello, world!''.PHP_EOL)';
preg_replace('/(.*)/e', $code, '' );
?>
而且,在几行代码中,似乎只执行了第一行:
<?php
$t=1;
$code = '$t++;$t++;';
preg_replace('/(.*)/e', $code, '' );
echo $t;
?>
输出2,而不是3。
问题: preg_replace()
中PCRE中的代码评估是否记录在某个地方?
preg_replace /e
eval不计算语句,而只计算单个表达式。
print()
是一个表达式
echo ...;
。
同样,任何后面可以跟一个分号的内容
>
您最好创建一个匿名函数并使用preg_replace_callback
调用它。