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

时间:2014-07-04 13:09:41

标签: javascript php domdocument html-formatting

我正在开发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似乎没有任何效果。

2 个答案:

答案 0 :(得分:1)

我不知道为什么(试图找出),但如果您使用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实际上是无效的,但一切都在头脑中。

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


?>