PHP DOMDocument命名空间

Obt*_*bto 7 php dom

我正在编写一个脚本,该脚本需要一个网页,并检测使用像facebook这样的按钮的次数.由于这最好用DOM完成,我决定使用PHP的DOMDocument.

不过,我遇到的一个问题是像facebook这样的按钮:

<fb:like send="true" width="450" show_faces="true"></fb:like>
Run Code Online (Sandbox Code Playgroud)

由于此元素在技术上具有"fb"的命名空间,因此DOMDocument会抛出一条警告,指出此命名空间前缀未定义.然后它继续去除前缀,所以当我到达所述元素时,它的标签不再是fb:like,而是.

有没有办法"预注册"命名空间?有什么建议?

小智 0

我遇到了同样的问题,并提出了以下解决方案/解决方法:

没有干净的方法可以使用 DOMDocument 解析具有命名空间的 HTML,而不丢失命名空间,但有一些解决方法:

  • 使用另一个接受 HMTL 代码中的命名空间的解析器。在这里查看详细的 HTML 解析器列表。这可能是最有效的方法。
  • 如果您想坚持使用 DOMDocument,您基本上必须对代码进行预处理和后处理。

    • 在将代码发送到 DOMDocument->loadHTML 之前,请使用正则表达式、循环或任何您想要查找所有命名空间标记的内容,并将自定义属性添加到包含命名空间的开始标记。

      <fb:like send="true" width="450" show_faces="true"></fb:like>
      
      Run Code Online (Sandbox Code Playgroud)

      然后会导致

      <fb:like xmlNamespace="fb" send="true" width="450" show_faces="true"></fb:like>
      
      Run Code Online (Sandbox Code Playgroud)
    • 现在将编辑后的代码交给 DOMDocument->loadHTML。它将删除名称空间,但会保留导致的属性

      <like xmlNamespace="fb" send="true" width="450" show_faces="true"></like>
      
      Run Code Online (Sandbox Code Playgroud)
    • 现在(再次使用正则表达式、循环或任何您想要的)查找具有属性 xmlNamespace 的所有标签,并将该属性替换为实际的命名空间。不要忘记将命名空间添加到结束标签中!

我不认为OP仍在寻找答案,我只是将这篇文章发布给在他们的研究中发现这篇文章的任何人。