оценка кода preg_replace с модификатором / e - PullRequest
3 голосов
/ 28 октября 2011

Я искал альтернативу 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): код регулярного выражения в строке

Неустранимая ошибка: preg_replace (): не удалось вычислить код:
echo ('Hello, world!'. PHP_EOL) в /Users/.../test.php в строке 4

Пока print() работает и выдает Привет, мир! :

<?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 .

Вопрос : документирована ли эта оценка кода в PCRE в preg_replace() где-нибудь? Не найдено на php.net

Ответы [ 2 ]

3 голосов
/ 28 октября 2011

eval preg_replace /e не оценивает операторы, а просто одно выражение.

print()

является выражением.

echo ...;

не является.
И также все, что может сопровождаться точкой с запятой.

См. http://www.php.net/manual/en/language.expressions.php для приблизительного обзора.

3 голосов
/ 28 октября 2011

Вам лучше создать анонимную функцию и вызвать ее, используя preg_replace_callback.

...