DOMDocument удаляет теги HTML в строке JavaScript
Я занимаюсь разработкой PHP-приложений довольно давно. Но это действительно заставляет меня бороться. Я загружаю полные страницы HTML, используя DomDocument. Эти страницы являются внешними и могут содержать JavaScript. Это вне моего контроля.
На некоторых страницах вещи не отображались так, как предполагалось, когда дело дошло до базового форматирования HTML в строках JavaScript. Я записал пример, который объясняет все это.
<?php
$html = new DOMDocument();
libxml_use_internal_errors(true);
$strPage = '<html>
<head>
<title>Demo</title>
<script type="text/javascript">
var strJS = "<b>This is bold.</b><br /><br />This should not be bold. Where did my closing tag go to?";
</script>
</head>
<body>
<script type="text/javascript">
document.write(strJS);
</script>
</body>
</html>';
$html->loadHTML($strPage);
echo $html->saveHTML();
exit;
?>
Я что-то пропустил?
Изменить: я изменил демо. Изменение LoadHTML на LoadXML больше не работает, и результат демонстрации пройдет проверку w3c. Также добавление блока CDATA в JavaScript, похоже, не имеет никакого эффекта.
2 ответа
Добавление
LIBXML_SCHEMA_CREATE
к
loadHTML()
опции решат проблему.
<?php
$html = new DOMDocument();
libxml_use_internal_errors(true);
$strPage = '<html>
<head>
<title>Demo</title>
<script type="text/javascript">
var strJS = "<b>This is bold.</b><br /><br />This should not be bold. Where did my closing tag go to?";
</script>
</head>
<body>
<script type="text/javascript">
document.write(strJS);
</script>
</body>
</html>';
$html->loadHTML($strPage, LIBXML_HTML_NODEFDTD | LIBXML_SCHEMA_CREATE);
echo $html->saveHTML();
exit();
?>
Я не знаю почему (пытался выяснить), но это работает, если вы загружаете HTML с помощью loadXML
вместо loadHTML
$html = new DOMDocument();
libxml_use_internal_errors(true);
$strPage = "<html><head>";
$strPage .= "<script type=\"text/javascript\">";
$strPage .= "var strJS = \"<b>This is bold.</b><br /><br />This should not be bold. Where did my closing tag go to?\";";
$strPage .= "</script>";
$strPage .= "<body>";
$strPage .= "<script type=\"text/javascript\">";
$strPage .= "document.write(strJS);";
$strPage .= "</script>";
$strPage .= "</body>";
$strPage .= "</head></html>";
$html->loadXML($strPage);
echo $html->saveHTML();
Хотя HTML на самом деле недействителен, все в голове.