Блоки PHP-кода в шаблонах загружаются в DOMDocument - PullRequest
3 голосов
/ 25 декабря 2011

Мне нужно разобрать HTML-шаблон с DOMDocument. Но HTML-код может содержать блоки PHP-кода, например:

<div id="test" data="<?php echo $somevar?>"> </div>

Когда я загружаю этот HTML, я получаю ошибку "Unescaped '<' не разрешен в значениях атрибутов ...". Парсер считает, что атрибут «data» не имеет закрывающей кавычки и <php является новым тегом. Как я могу указать, чтобы игнорировать тег <php или что-то в этом роде? </p>

Ответы [ 4 ]

2 голосов
/ 25 декабря 2011

Ваш HTML-код:

<div id="test" data="<?php echo $somevar?>"> </div>

Не является XML-кодом.Для XML это недопустимо, HTML в порядке.Чтобы загрузить HTML-код с DOMDocument, вы можете использовать функцию DOMDocument::loadHTML Docs .

Она загрузит ваш шаблон без каких-либо ошибок.

Пример / Демо :

$html = '<div id="test" data="<?php echo $somevar?>"> </div>';
$doc = new DOMDocument();
$doc->loadHTML($html);

Связано: Может ли PHP включать работу только для указанной части файла?

1 голос
/ 25 декабря 2011

Если вы попытаетесь проанализировать документ с тегами PHP в нем, вы должны удалить его или сначала захватить вывод файла, а затем проанализировать его.

Вы можете захватить вывод файла с помощьюob_start() и ob_get_clean();.

Вы можете удалить теги PHP с помощью регулярного выражения:

$cleaned = preg_replace("/<\?php.*?\?>/i","",$input);
0 голосов
/ 25 декабря 2011

Это кажется хакерским, но ...

$doc->loadHtml(str_replace('<?php', '&lt;?php', file_get_contents($file)));
0 голосов
/ 25 декабря 2011

Попробуйте:

<div id="test" data="<?= htmlentities($somevar) ?>"> </div>

Вы также можете попробовать htmlspecialchars(), который является «более легкой» версией htmlentities().

...