preg_用/e修饰符替换代码求值


preg_replace code evaluation with /e modifier

我正在寻找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调用它。