【问题标题】:DOMDocument removes HTML tags in JavaScript stringDOMDocument 删除 JavaScript 字符串中的 HTML 标签
【发布时间】: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 = "&lt;b&gt;This is bold.&lt;\/b&gt;...
  • 经过测试,你是对的。唯一的问题是我通常无法控制加载到 DOM 中的(外部)HTML。可能是 loadHTML 实现中的错误,还是需要打开隐藏选项才能使其正常工作?
  • @James: jibbering.com: "...需要一个 HTML 解析器来获取第一个 [...] "&lt;/" [...] 作为脚本结束的标记元素。”。 HTML5:“...总是将“&lt;!--”转义为“&lt;\!--”,“&lt;script”转义为“&lt;\script”,以及“&lt;/script”转义为“&lt;\/script”[... ] 在 HTML 中解析 script 块是一种奇怪而奇特的做法......"。

标签: javascript php html domdocument


【解决方案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 实际上是无效的,但一切都在头脑中。

【讨论】:

  • 我改变了我的例子。将 loadHTML 更改为 loadXML 不再起作用。由于无效的 HTML,它实际上被验证为有效的 XML。
  • @Arjoes 您的示例代码已更新,如果您使用 loadXML 而不是 loadHTML,它将起作用,我知道它不理想且不直观,但我根本不认为 DOMDocument 看到 &lt;script&gt; 标签像 html 标签,也不能像执行一样从 js 中提取元素。 您实际上想对字符串做什么 就好像您没有操作 HTML 或从中提取 HTML,只是回显 DOMDocument 是错误的工具。抱歉无法给出正确的解决方案:(
【解决方案2】:

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


?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-21
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2021-02-05
    相关资源
    最近更新 更多