2008-09-15 115 views
4

我有一堆類似HTML的遺留文檔。如在HTML中,他們看起來像HTML,但有額外的組成標籤,不是HTML的一部分在PHP中容錯HTML/XML/SGML解析

<strong>This is an example of a <pseud-template>fake tag</pseud-template></strong> 

我需要解析這些文件。 PHP是唯一可用的工具。這些文檔並不接近於格式良好的XML。

我最初的想法是在PHP DOMDocument上使用loadHTML方法。但是,這些方法會扼制HTML標籤,並會拒絕解析字符串/文件。

$oDom = new DomDocument(); 
$oDom->loadHTML("<strong>This is an example of a <pseud-template>fake tag</pseud-template></strong>"); 
//gives us 
DOMDocument::loadHTML() [function.loadHTML]: Tag pseud-template invalid in Entity, line: 1 occured in .... 

唯一的解決辦法,我已經能夠拿出是預處理與字符串替換功能的文件,將刪除無效的標籤,並用有效的HTML標籤(也許有跨度替換它們標籤名稱的ID)。

有沒有更優雅的解決方案?一種讓DOMDocument知道其他標籤被視爲有效的方法?有沒有一個不同的,健壯的HTML解析類/對象用於PHP?

(如果不是很明顯,我不認爲正則表達式這裏有效的解決方案)

更新:在假標籤的信息是目標的一部分在這裏,所以像整齊不一個選項。另外,我在爲某些層次(如果不是全部的話)進行了格式清理,這就是爲什麼我首先查找DomDocument的loadHTML方法的原因。

回答

5

在加載文檔時,您可以用libxml_use_internal_errors取消警告。例如:

libxml_use_internal_errors(true); 
$doc = new DomDocument(); 
$doc->loadHTML("<strong>This is an example of a <pseud-template>fake tag</pseud-template></strong>"); 
libxml_use_internal_errors(false); 

如果由於某種原因,你需要訪問的警告,使用libxml_get_errors

2

我想知道如果通過HTML Tidy傳遞「壞」HTML可能有助於第一遍?值得一看,如果你能夠使文檔形成良好,也許你可以把它作爲一個常規的XML文件加載到DomDocument中。

+0

道歉,我本來應該更具體,什麼我需要分析出該文件的部分是什麼在假標籤中找到。 – 2008-09-15 21:07:03

+0

我建議HTMLTidy作爲一個預處理步驟,試圖讓你形成良好的XML,然後你可以用DomDocument解析它,並讀取整個DOM,並帶有任何好運:) – 2008-09-15 21:27:15

+0

不會整理去掉僞造標記以及所有格式化它呢? – 2008-09-17 02:12:08

1

@Twan 您不需要用於解析自定義XML的DOMDocument的DTD。只要使用DOMDocument->load(),並且只要XML格式良好,就可以讀取它。

一旦你得到的文件格式良好,那就是當你可以開始查看XML解析器時,在這之前你是S.O.L. Lok Alejo說,你可以看看HTML TIDY,但它看起來像HTML特有的,我不知道它會如何與您的自定義元素。

我不認爲正則表達式這裏

一個有效的解決方案,直到你良構,這可能是你唯一的選擇。一旦你獲得了文檔到這個階段,那麼你就明白了DOM的功能。

+0

當你使用DOMDocument加載一個HTML文件時,它似乎做了一些清理級別:格式良好,但要求你所有的標籤都是合法的HTML標籤。我正在尋找一些前者,但不是後者。 – 2008-09-15 22:15:19

0

我的快速和骯髒的解決這個問題是要運行一個符合循環我用正則表達式定製標籤列表。正則表達式不捕獲在其內部具有另一個內部自定義標籤的標籤。

當匹配時,處理該標記的函數被調用並返回「處理的HTML」。如果該自定義標籤位於另一個自定義標籤內,而不是由於實際的HTML插入到子代中而變爲無子標籤,並且它將與正則表達式匹配並在該循環的下一次迭代中處理。

當沒有無孩子的自定義標籤要匹配時,循環結束。總的來說,它是迭代的(一個while循環)而不是遞歸的。

0

@Alan風暴

你我的其他答案的評論讓我的思維:

當加載與DOM文檔HTML文件時,被用來做重新清理某種程度:好良好形成性,但要求你所有的標籤都是合法的HTML標籤。我正在尋找一些前者,但不是後者。 (Alan Storm)

對標籤運行一個正則表達式(對不起!),當它找到一個不是有效的HTML元素時,用一個你知道不存在的有效元素替換它的文件(blink想到...),並給它一個屬性值與非法元素的名稱,以便您可以在之後切換回來。例如:

$code = str_replace("<pseudo-tag>", "<blink rel=\"pseudo-tag\">", $code); 
// and then back again... 
$code = preg_replace('<blink rel="(.*?)">', '<\1>', $code); 

很明顯,代碼將無法正常工作,但您會得到一般想法?