我一直在寻找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上找不到
答案 0 :(得分:3)
最好创建匿名函数并使用preg_replace_callback
调用它。
答案 1 :(得分:3)
preg_replace /e
eval不评估语句,只是单个表达式。
print()
是表达。
echo ...;
不是。
同样可以用分号跟着的任何东西。
请参阅http://www.php.net/manual/en/language.expressions.php进行粗略概述。