Как исправить PHP preg_replace () ошибочный порядок результатов? - PullRequest
0 голосов
/ 17 июля 2011

Я получил неправильный результат: 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 ]

2 голосов
/ 17 июля 2011
function finclude($file){
    return include($file);
}

<?php return date('jS \of F'); ?>

Результат не ожидается, потому что вы печатаете date, затем finclude возвращаете null, затем вы печатаете "Today is "+finclude

1 голос
/ 17 июля 2011

То, что вы называете ошибочным в порядке следования, на самом деле вызвано порядком выполнения ваших операторов:

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 всегда опасно, и его обычно следует избегать.Так что береги себя.

0 голосов
/ 17 июля 2011

я думаю, вам нужно поставить <?php return date('jS \of F'); ?> в date.php

...