Как исправить 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

Другие вопросы по тегам