php - 使用 PHP DOMDocument 解析脏 html 代码有困难

标签 php html xml dom

我希望能够加载任何 html 文档并使用 php 的 domdocument 功能对其进行编辑。
问题是,一些网站,例如 facebook,将 XML 样式的命名空间添加到它们的标签中。

<fb:like send="true" width="450" show_faces="true"></fb:like>

DOMDocument 对脏代码非常宽容,但它不会接受 html 代码中的命名空间。发生的事情是:

  • 如果我使用 loadHTML 加载代码,命名空间将被删除,但我需要它保留
  • 如果我使用 loadXML 加载代码,我会收到大量错误,指出我没有加载有效的 XML

所以我的想法是将我获得的 html 转换为 XML,以便我可以使用 loadXML 解析它。我的问题是,我该怎么做,我应该使用哪个工具(我听说过 Tidy,但我无法让它工作)或者使用不同的解析器(可以处理 html 中的 namespace 的解析器)是更好的主意代码)

代码片段:

<?php
$html = file_get_contents($_POST['url']);

$domDoc = new DOMDocument();
$domDoc->loadHTML($html);

//Just do anything here. It doesn't matter what. For example I'm deleting the head tag
$headTag = $domDoc->getElementsByTagName("head")->item(0);
$headTagParent = $headTag->parentNode;
$headTagParent->removeChild($headTag);

echo $domDoc->saveHTML();

//This will work as expected for any url EXCEPT the ones that use XML namespaces like facebook does as described above. In case of such dirty coding the namespace will get deleted by DOMDocument

?>

最佳答案

没有一种干净的方法可以在不丢失命名空间的情况下使用 DOMDocument 解析带有命名空间的 HTML,但有一些解决方法:

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

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

      <fb:like send="true" width="450" show_faces="true"></fb:like>
      

      然后会导致

      <fb:like xmlNamespace="fb" send="true" width="450" show_faces="true"></fb:like>
      
    • 现在将编辑后的代码提供给 DOMDocument->loadHTML。它将去除 namespace ,但会保留产生的属性

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

关于php - 使用 PHP DOMDocument 解析脏 html 代码有困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30096287/

相关文章:

c# - LINQ:根据属性值从 XML 中删除元素?

c# - 带有 XmlTypeMapping 和 XmlRootAttribute 参数的 XmlSerializer 构造函数

php - 如何将金额格式转换为印尼盾?

css - 将跨度链接居中

php - WordPress 视频嵌入代码宽度增加不起作用

html - 表格边框不适用于导出到 excel

html - 媒体查询最小宽度 1200px 不起作用

sql - 如何从 XMLType 节点中提取元素路径?

php - Mysql INNER JOIN 和资源#9

php - 如何使用 laravel 4 安静地返回图像?