Как исправить PHP preg_replace() ошибочный порядок результатов?
Дефектный результат, который я получаю сейчас: 17th of July, 2011Today is .
function finclude($file){
include($file);
}
$str = "Today is {include 'date.php'}.";
echo preg_replace("/\{include '(.*)\'}/e", 'finclude("$1")', $str);
date.php:
<?php echo date('jS \of F'); ?>, 2011
Ожидаемый результат: Today is 17th of July.
3 ответа
function finclude($file){
return include($file);
}
<?php return date('jS \of F'); ?>
Результат не ожидается, потому что вы печатаете date
, затем finclude
вернуть null
затем вы печатаете "Today is "+finclude
То, что вы называете ошибочным в порядке следования, на самом деле вызвано порядком выполнения ваших операторов:
echo preg_replace("/\{include '(.*)\'}/e", 'finclude("$1")', $str);
Начну выводить (echo
), а затем позвоните preg_replace
функция. В котором вы используете e - eval
модификатор для выполнения кода, а именно функция finclude
,
Так finclude
получить выполнено раньше, чем preg_replace
вернет свой результат.
Так что если finclude
делает вывод сам по себе, он будет отображаться перед результатом preg_replace
,
Знание этого - половина решения вашей проблемы. Скорее всего, вы не намеревались этот порядок вывода (ваш ожидаемый результат отличается), и вы просто хотели сделать finclude
вернуть значение вместо вывода чего-либо. Чтобы преобразовать вывод в возвращаемое значение, вы можете использовать выходной буфер:
function finclude($file){
ob_start();
include($file);
return ob_get_clean();
}
$str = "Today is {include 'date.php'}.";
echo preg_replace("/\{include '(.*)\'}/e", 'finclude("$1")', $str);
Это гарантирует, что каждый выход в пределах finclude
будет возвращено как возвращаемое значение.
После этого вы можете повторно использовать существующий код / включения, которые обычно выводятся в процессе поиска и замены. Однако используя e
Модификатор всегда опасен и его обычно следует предотвращать. Так что будьте аккуратнее.
Я думаю тебе нужно поставить <?php return date('jS \of F'); ?>
в date.php