preg_replace 使用 /e 修饰符进行代码评估

Ser*_*rge 5 php pcre preg-replace echo

我正在寻找 eval() 的替代方法来执行字符串变量中包含的代码,并注意到了preg_replacewith/e修饰符。然而,代码的计算方式非常奇怪。

例如,echo()在 php 5.3.6 中会导致错误:

<?php
$code = 'echo( \'Hello, world!\'.PHP_EOL)';
preg_replace('/(.*)/e', $code, '' );
?>
Run Code Online (Sandbox Code Playgroud)

错误信息:

解析错误:语法错误,/Users/.../test.php(4) 中出现意外的 T_ECHO:正则表达式代码在线

致命错误:preg_replace():无法评估代码:
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, '' );
?>
Run Code Online (Sandbox Code Playgroud)

另外,似乎在几行代码中,只执行了第一行:

<?php
$t=1;
$code = '$t++;$t++;';
preg_replace('/(.*)/e', $code, '' );
echo $t;
?>
Run Code Online (Sandbox Code Playgroud)

输出2,而不是3

问题:PCRE 中的代码评估是否preg_replace()记录在某处?在 php.net 上找不到

mar*_*rio 3

preg_replace /eeval 不计算语句,而只是计算单个表达式。

print()
Run Code Online (Sandbox Code Playgroud)

是一种表达。

echo ...;
Run Code Online (Sandbox Code Playgroud)

不是。
同样,任何后面可以跟分号的内容也是如此。

有关粗略概述,请参阅http://www.php.net/manual/en/language.expressions.php 。