Как -то мне потребовалось сохранять небольшие кусочки php-кода (вернее микс текста, html, php) в базе данных. В последствии эти кусочки должны были извлекаться из базы, но быть не простым текстом, а выполняться, т.е. исполняться как функции. Решением этой задачи хочу сегодня с вами поделиться.
Итак. В базе у меня хранится какой-то текст, а php-код выделен произволными тегами
.
Конечно, можно использовать и привычные <?php ?> но, эти теги не несут никакой функции, кроме как указать скрипту что выделенная часть текста есть php-код, а <?php ?> любой визуальный редактор (типа CKEDITOR) заменит на <?php ?>
Касаться работы с БД мы не будем, это не цель этого урока. Допустим мы извлекли текст из БД:
$example1 = '<p>Какой-то текст</p><strong>[php]echo "Привет, Я PHP-код";
</strong><p>Еще Какой-то текст</p>';[/PHP]
Вот эта часть
echo "Привет, Я PHP-код";
должна интерпритироваться как php-код.
В php есть функция preg_replace и с использованием модификатора e она и должна все сделать. Но у меня это НЕ заработало, искать и выяснять причины я не стал, а просто написал свою функцию, ниже я ее работу прокомментирую.
<?php
function parseText($element){
// Функция ищет в $element участки [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>
<?php echo $example1?><br />
<h3 style="color: blue;"> Функция вернула:</h3>
<?php echo parseText($example1)?> [/PHP]
Первым делом регулярным выражением вырезаем пробельные символы, которые идут подряд.
Далее самое интересно. Функции preg_replace_callback первым аргументом передаем регулярное выражение, вторым аргументом идет "функция в функции" create_function. Важно аргументы create_function передвавать в одинарных кавычках. Первым аргументом create_function является массив, в $matches[0] будет содержать часть текста найденному по регулярному выражению, $matches[1] тоже самое, только без тегов
(вот, теперь они нам уже не нужны).
Для выполнения найденного текста как php-кода я использую функцию eval(), а чтобы результат не вывелся тут же на экран, я перед eval() включаю буферизацию вывода ob_start(). После буфер пишем в переменную и возращаем preg_replace_callback. Вот и все
в строке выполнился как php, и результат выполнения заменил исходный участок
.
И напоследок. Помините про то, что вы передаете в
. Передаваемая строка обязана быть правильным кодом PHP, включая окончание операторов точкой с запятой.Также помните, что значения, заданные переменным в eval(), останутся действовать затем и в основном скрипте.
На сегодня это все. Благодарю за внимание, буду рад, если этот небольшой сниппет кому-нибудь пригодиться.