как вычислить() сегмент строки
Вопрос
У меня есть строка, в которой есть HTML и PHP, когда я извлекаю строку из базы данных, она выводится на экран, но PHP-код не отображается.Строка выглядит следующим образом:
$string = 'Hello <?php echo 'World';?>';
echo $string;
Выходной сигнал
Hello
Исходный код
Hello <?php echo 'World';?>
Когда я заглядываю в исходный код, я вижу там строку php.Итак, что мне нужно сделать, это eval() только для сегмента php, который находится в строке.
Одна вещь, которую следует учитывать, это то, что PHP может быть расположен в любом месте строки в любой момент времени.
* Просто чтобы уточнить, моя конфигурация PHP верна, это случай, когда какой-то PHP выгружается из базы данных и не рендерится, потому что я повторяю переменную с PHP-кодом в ней, она не запускается.*
Еще раз спасибо за любую помощь, которую я могу получить.
Решение
$str = "Hello
<?php echo 'World';?>";
$matches = array();
preg_match('/<\?php (.+) \?>/x', $str, $matches);
eval($matches[1]);
Это сработает, но, как уже предлагали и будут предлагать другие, это ужасная идея.Архитектура вашего приложения никогда не должна вращаться вокруг хранения кода в базе данных.
Проще всего, если у вас есть страницы, на которых всегда должны отображаться строки, храните эти строки в базе данных, а не код для их создания.Данные реального мира сложнее этого, но они всегда должны быть правильно смоделированы в базе данных.
Редактировать:Потребуется адаптация с помощью preg_replace_callback для правильного удаления источника / интерполяции.
Другие советы
Вам не следует оценивать php-код, просто запустите его.Это должен быть установленный интерпретатор php и правильно настроенный apache + php.Затем этот php-файл должен выводить Hello World.
Ответ на правку: Используйте preg_replace_callback, чтобы получить php-часть, оценить ее, заменить входные данные на выходные, затем повторить их.Но.Если вы должны оценивать данные, полученные из базы данных, я почти уверен, что это ошибка проектирования.
eval() должен работать нормально, при условии, что код написан на правильном PHP и заканчивается точкой с запятой.Как насчет того, чтобы сначала удалить тег php, а затем оценить его.
Следующий пример был протестирован и работает:
<?php
$db_result = "<?php echo 'World';?>";
$stripped_code = str_replace('?>', '', str_replace('<?php', '', $db_result));
eval($stripped_code);
?>
Просто убедитесь, что все, что вы извлекаете из базы данных, сначала было должным образом очищено, поскольку вы, по сути, разрешаете любому, кто может загружать содержимое в базу данных, выполнять код.