Все ленты — последние статьи

PHP-сниппет. Интерпритация php кода внутри текста

Как -то мне потребовалось сохранять небольшие кусочки php-кода (вернее микс текста, html, php) в базе данных. В последствии эти кусочки должны были извлекаться из базы, но быть не простым текстом, а выполняться, т.е. исполняться как функции. Решением этой задачи хочу сегодня с вами поделиться.
demosourse

Итак. В базе у меня хранится какой-то текст, а php-код выделен произволными тегами [php][/php].
Конечно, можно использовать и привычные <?php ?> но, эти теги не несут никакой функции, кроме как указать скрипту что выделенная часть текста есть php-код, а <?php ?> любой визуальный редактор (типа CKEDITOR) заменит на &lt;?php ?&gt;

 

Касаться работы с БД мы не будем, это не цель этого урока. Допустим мы извлекли текст из БД:


$example1 = '<p>Какой-то текст</p><strong>[php]echo "Привет, Я PHP-код";[/php]</strong><p>Еще Какой-то текст</p>';

Вот эта часть [php]echo "Привет, Я PHP-код";[/php] должна интерпритироваться как php-код.

В php есть функция preg_replace и с использованием модификатора e она и должна все сделать. пример (см. example4). Но у меня это НЕ заработало, искать и выяснять причины я не стал, а просто написал свою функцию, ниже я ее работу прокомментирую.

<?php

function parseText($element){
// Функция ищет в $element участки [php]Код[/php] и выполняет их как php-код,
// Полученным результатом заменяет найденные участки [php]Код[/php]
$element = preg_replace('/s{2,}/iu', '', $element);
$result = preg_replace_callback('~[php](.*)[/php]~ui',
create_function('$matches','
ob_start();
eval($matches[1]);
$result = ob_get_contents();
ob_end_clean();
return $result;
'),
$element);
return $result;
}

?>
<h3 style="color: blue;"> Отдали функции: </h3>
<br />
<h3 style="color: blue;"> Функция вернула:</h3>
<?php echo parseText($example1)?>

Первым делом регулярным выражением вырезаем пробельные символы, которые идут подряд.

Далее самое интересно. Функции preg_replace_callback первым аргументом передаем регулярное выражение, вторым аргументом идет "функция в функции" create_function. Важно аргументы create_function передвавать в одинарных кавычках. Первым аргументом create_function является массив, в $matches[0] будет содержать часть текста найденному по регулярному выражению, $matches[1] тоже самое, только без тегов [php][/php] (вот, теперь они нам уже не нужны).

Для выполнения найденного текста как php-кода я использую функцию eval(), а чтобы результат не вывелся тут же на экран, я перед eval() включаю буферизацию вывода ob_start(). После буфер пишем в переменную и возращаем preg_replace_callback. Вот и все [php][/php] в строке выполнился как php, и результат выполнения заменил исходный участок [php][/php].

И напоследок. Помините про то, что вы передаете в [php][/php]. Передаваемая строка обязана быть правильным кодом PHP, включая окончание операторов точкой с запятой.Также помните, что значения, заданные переменным в eval(), останутся действовать затем и в основном скрипте.