Вопрос

У меня есть строка, в которой есть 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);
?>

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top