有没有办法使用 PHP 的 DOMDocument 来解析包含 javascript 的 HTML,而 javascript 本身包含 HTML 字符串?

Is there a way to use PHP's DOMDocument to parse HTML containing javascript which itself contains HTML strings?

提问人:Dougall Winship 提问时间:6/15/2023 更新时间:6/17/2023 访问量:66

问:

我有一个包含 <script> 标签的 HTML 字符串,其中包含通过 window.customElements.define(...) 创建影子 DOM 元素的 javascript,这反过来又包含一个 innerHTML 定义,该定义将自定义元素的 HTML 定义为字符串。

这是我尝试使用 PHP 的 DOMDocument 处理的有效 HTML,但是 DOMDocument 似乎被 innerHTML 的内容弄糊涂了,并开始将其内容视为需要处理的节点。

有没有办法解决这个问题,这样它就不会再混淆DOMDocument?

HTML 的相关部分看起来有点像这样:

<script>
class ExampleElement extends HTMLElement {
   constructor() {
      super();
      this.attachShadow({ mode: 'open' })
          .innerHTML = '<label>this is what confuses DOMDocument</label>'
  }
}
window.customElements.define('example-element', ExampleElement);
</script>

然后在 PHP 中像这样处理

$doc = new DOMDocument();
$doc->loadHTML($html, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);

然后,libxml 会生成一个关于 </label 的错误>该错误不匹配:“意外的结束标记:实体中的标签”

显然我可以 - 分解 innerHTML,以便 DOMDocument 不再使用字符串连接将 <label> 和 </label> 识别为标签,
或者

- 通过 document.createElement(...) 等构建元素的内容

但是,由于这是有效的 HTML,因此了解它是否可以按我的立场进行解析会很有用。

javascript php domdocument

评论

0赞 CBroe 6/15/2023
“这是有效的 HTML” - 在 HTML5 中,是的,但我不知道 DOMDocument 是否真的这样解析它?在 HTML 4.01 中,这将是一个错误 - 脚本元素中的每个元素都会在此时隐式结束脚本元素,并且必须将其编写为,或者首先将整个脚本元素内容包装到 CDATA 中。</<\/
0赞 Dougall Winship 6/16/2023
做出这种区分的好点。

答:

-2赞 Abid Raheem 6/15/2023 #1
class ExampleElement extends HTMLElement {
   constructor() {
      super();
      this.attachShadow({ mode: \'open\' })
          .innerHTML = \'<label>this is what confuses DOMDocument</label>\'
  }
}
window.customElements.define(\'example-element\', ExampleElement);
</script>';

$doc = new DOMDocument();
libxml_use_internal_errors(true); // Disable libxml errors
$doc->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

libxml_use_internal_errors(false); // Enable libxml errors 

// Continue processing the DOMDocument object as required

您可以使用以下代码来解析包含 javascript 的 html,使用 PHPDOM 文档

评论

4赞 Nigel Ren 6/15/2023
您能否解释一下这如何解决问题。它可以帮助其他人了解你做了什么。
0赞 Community 6/16/2023
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。
1赞 Sammitch 6/16/2023 #2

每:https://bugs.php.net/bug.php?id=80095

libxml 使用 HTML 4 规则,其中 </ 是结束标记。即使标签与上一个开始的标签不匹配。若要避免此问题,请在脚本中将结束标记写为“<\/”。

所以改成.</label><\/label>

它将解析干净,JS 应该解释为字符串中的文字。\//

评论

0赞 Dougall Winship 6/16/2023
该错误链接是一个非常有用的发现......正如你所建议的那样,(1)生成浏览器满意的javascript,(2)不再混淆DOMDocument