提问人:Dougall Winship 提问时间:6/15/2023 更新时间:6/17/2023 访问量:66
有没有办法使用 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?
问:
我有一个包含 <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,因此了解它是否可以按我的立场进行解析会很有用。
答:
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 文档
评论
每:https://bugs.php.net/bug.php?id=80095
libxml 使用 HTML 4 规则,其中 </ 是结束标记。即使标签与上一个开始的标签不匹配。若要避免此问题,请在脚本中将结束标记写为“<\/”。
所以改成.</label>
<\/label>
它将解析干净,JS 应该解释为字符串中的文字。\/
/
评论
</
<\/