繁体   English   中英

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

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

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


?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM