【发布时间】:2022-03-31 09:48:31
【问题描述】:
我开发 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 似乎也没有任何效果。
【问题讨论】:
-
你错过了什么吗?是->“警告:DOMDocument::loadHTML(): Unexpected end tag : b in Entity...”所以问题是 loadHTML 正在吃掉脚本中的标签。没有回答你的问题,但也许能解开一些谜团。
-
好的,谢谢。这正是这个演示的目的。为什么它会吃掉 标签?
-
我不知道为什么。您可以通过反斜杠转义 javascript 字符串中包含的结束标记中的斜杠来避免它,例如
var strJS = "<b>This is bold.<\/b>... -
经过测试,你是对的。唯一的问题是我通常无法控制加载到 DOM 中的(外部)HTML。可能是 loadHTML 实现中的错误,还是需要打开隐藏选项才能使其正常工作?
-
@James: jibbering.com: "...需要一个 HTML 解析器来获取第一个 [...] "
</" [...] 作为脚本结束的标记元素。”。 HTML5:“...总是将“<!--”转义为“<\!--”,“<script”转义为“<\script”,以及“</script”转义为“<\/script”[... ] 在 HTML 中解析script块是一种奇怪而奇特的做法......"。
标签: javascript php html domdocument