То, что вы называете ошибочным в порядке следования, на самом деле вызвано порядком выполнения ваших операторов:
echo preg_replace("/\{include '(.*)\'}/e", 'finclude("$1")', $str);
Запустит вывод (echo
) и затем вызовет функцию preg_replace
.В котором вы используете модификатор e - eval
для выполнения кода, а именно функцию finclude
.
Так что finclude
get выполнено раньше , чем 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
всегда опасно, и его обычно следует избегать.Так что береги себя.