2015-05-07 53 views
4

我希望能夠加載任何html文檔並使用php的domdocument功能對其進行編輯。
問題是,有些網站(例如facebook)會將XML樣式的名稱空間添加到其標籤中。使用PHP DOMDocument難以解析髒的html代碼

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

DOMDocument對髒代碼非常寬容,但它不會接受html代碼中的namescpaces。什麼情況是:

  • 如果我使用loadHTML加載代碼,名稱空間將得到剝離出來,但我需要它留
  • 如果我使用的loadXML加載代碼,我會得到噸的錯誤是狀態我沒有加載有效的XML

所以我的想法是將我得到的html轉換成XML,以便我可以使用loadXML解析它。我的問題是,我該如何做到這一點,我應該使用哪種工具(我聽說過Tidy,但我無法讓它工作),還是使用不同的解析器(一種可以處理html中的名稱空間的解析器代碼)

代碼片段:

<?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 

>

+0

可能重複(http://stackoverflow.com/questions/30076922/convert-html-code-to-doc-using-php- [使用PHP和PHPWord轉換HTML代碼DOC]和-phpword) –

+0

請編輯你的問題,並添加一個HTML/XML的最低範例。 – michi

+0

@Varun Naharia我很抱歉,但這並沒有幫助我。那對我的問題沒有答案。 – Syndace

回答

2

有沒有乾淨的方式來解析使用的DOMDocument不失命名空間的命名空間HTML,但也有一些解決方法:

  • 使用另一個接受HMTL代碼中名稱空間的解析器。查看here,瞭解HTML解析器的一個很好的詳細列表。這可能是最有效的方法。
  • 如果你想堅持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> 
      
    • 現在請編輯的代碼到上一層> loadHTML。它會帶出的命名空間,但它會繼續屬性導致

      <like xmlNamespace="fb" send="true" width="450" show_faces="true"></like> 
      
    • 現在(再次使用正則表達式,環或任何你想要的)找到屬性XML命名空間的所有標籤,更換與實際命名空間的屬性。不要忘記還要將名稱空間添加到結束標記中!的