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

时间:2011-10-28 15:52:12

标签: php preg-replace echo pcre

我一直在寻找eval()方法的替代方法来执行字符串变量中包含的代码,并注意到preg_replace带有/e修饰符。 但是,代码的评估非常奇怪。

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

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

错误讯息:

  

解析错误:语法错误,/Users /.../test.php(4)中的意外T_ECHO:行上的正则表达式

     

致命错误:preg_replace():无法评估代码:第4行/Users/.../test.php中的echo('Hello,world!'。PHP_EOL)

虽然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中的代码评估? 在php.net上找不到

2 个答案:

答案 0 :(得分:3)

最好创建匿名函数并使用preg_replace_callback调用它。

答案 1 :(得分:3)

preg_replace /e eval不评估语句,只是单个表达式。

print()

是表达。

echo ...;

不是。
同样可以用分号跟着的任何东西。

请参阅http://www.php.net/manual/en/language.expressions.php进行粗略概述。