DOMDocument删除JavaScript字符串中的HTML标签


DOMDocument removes HTML tags in JavaScript string

我开发PHP应用程序已经有一段时间了。但这个真的让我很纠结。我正在使用DomDocument加载完整的HTML页面。这些页面是外部的,可能包含JavaScript。这不是我能控制的。

在一些页面上,当它归结为JavaScript字符串的基本HTML格式时,事情并没有按照它应该的方式呈现。我写了一个例子来解释这一切。

<?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中似乎没有任何效果。

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();

?>

我不知道为什么(试图找出),但如果你使用loadXML而不是loadHTML加载HTML

$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实际上是无效的,但所有内容都在头部