我正在开发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似乎没有任何效果。
答案 0 :(得分:1)
我不知道为什么(试图找出),但如果您使用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实际上是无效的,但一切都在头脑中。
答案 1 :(得分:0)
将 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();
?>