2010-02-28 28 views
8

在我的代碼中,我使用openoffice將一些樣式化的xls文檔轉換爲html。 然後我使用xml_parser_create解析表格。 問題是,openoffice創建oldschool html與未封閉的<BR><HR>標籤,它不會創建文檔類型,也不會引用屬性<TABLE WIDTH=4>在PHP中解析格式不正確的HTML

我知道的php解析器不喜歡這樣,併產生XML格式錯誤。我目前的解決方案是在解析文件之前對文件運行一些正則表達式,但這既不好也不快。

你知道一個(希望包含的)php解析器,它不關心這些類型的錯誤嗎?或者,也許是一個快速的方法來修復一個'壞'的HTML?

回答

8

的解決方案 「修復」 破HTML可以使用HTMLPurifier(引用)

HTML淨化器是用PHP編寫的符合標準的 HTML過濾庫。
HTML淨化器不僅會爲一個徹底的審計, 安全又寬容的白名單中刪除 所有惡意代碼(更好地稱爲 XSS),它 也將確保您的文檔符合


標準 另一種想法可能會嘗試與DOMDocument::loadHTML(報價)加載你的HTML:

該函數解析字符串源中包含的 的HTML。不像加載 XML,HTML不一定是 格式良好的加載。

如果您要從文件加載HTML,請參閱DOMDocument::loadHTMLFile

+0

+1用於介紹htmlpurifier。 也可以查看http://simplehtmldom.sourceforge.net/。 – Alexar 2010-02-28 16:43:48

+0

淨化器很好,但對於這個問題,感覺有點過度。 DOMParser也是如此。這是不正確的,它將需要比簡單的薩克斯解析器更多的時間和內存? – 2010-03-04 22:16:10

+0

也許它會需要更多的RAM和時間;但它不僅僅是一個簡單的SAX解析,它只會讀取數據,而不會修復它;;;我會說一個SAX解析器將只能讀取有效的XML - 而HTMLPurifier和'DOMDocument :: loadHTML'都能夠讀取「破碎的」HTML。 – 2010-03-04 23:07:48

4

SimpleHTML

對於修復損壞的HTML,你可以使用Tidy

作爲替代方案,您可以使用本機XML Reader。因爲它在文檔流中作爲前進光標並停在路徑上的每個節點上,所以它不會在無效的XML文檔上中斷。

http://www.ibm.com/developerworks/library/x-pullparsingphp.html

+1

+1爲Tidy。我發現它比SimpleHTML更強大。 2個獨立的工具真的可以完成2個不同的工作 – HappyTimeGopher 2012-06-12 14:12:57

1

您仍在使用PHP 4 XML API的任何特定原因?

如果您可以放棄使用PHP 5的XML API,那麼有兩種可能性。

首先,嘗試內置的HTML解析器。這真的不是很好(它往往會扼殺格式不正確的HTML),但它可能會伎倆。看看DomDocument :: LoadHTML。

第二個方案 - 你可以嘗試基於HTML5分析器規格的HTML解析器:

http://code.google.com/p/html5lib/

這往往工作比PHP內置HTML解析器更好。它將HTML加載到DomDocument對象中。

+0

我寧願不使用dom解析器,因爲文檔相當大。 (而且我已經爲薩克斯編寫了大量的代碼) – 2010-03-04 23:26:48

0

解決方案是使用DOMDocument。

實施例:

$str = " 
<html> 
<head> 
    <title>test</title> 
</head> 
<body> 
    </div>error. 
    <p>another error</i> 
</body> 
</html> 
"; 

$doc = new DOMDocument(); 
@$doc->loadHTML($str); 
echo $doc->saveHTML(); 

優勢:本機包括在PHP,違背PHP整齊。