2015-01-13 88 views
0

我想解析一個html文件。Domdocument loading

$html =htmlentities(file_get_contents('http://forums.heroesofnewerth.com/showthread.php?553261')); 
$dom = new DOMDocument(); 
$dom->loadHTML($html);//line 30 

我得到這些錯誤

Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: 113 in D:\Projects\Web projects\done\honscript\index.php on line 30 

Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: 113 in D:\Projects\Web projects\done\honscript\index.php on line 30 

Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: 200 in D:\Projects\Web projects\done\honscript\index.php on line 30 

Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: 200 in D:\Projects\Web projects\done\honscript\index.php on line 30 

改爲使用htmlenttities並獲得

Warning: DOMDocument::loadHTML(): Empty string supplied as input in D:\Projects\Web projects\done\honscript\index.php on line 30 
+0

index.php中的第30行是什麼? – Fuzzyma

+0

'new DOMDocument();' –

+0

$ dom-> loadHTML($ html);是行30 –

回答

0

你要載入的文件是無效的HTML,因而無效DOM (請參閱http://validator.w3.org/check?verbose=1&uri=http%3A%2F%2Fforums.heroesofnewerth.com%2Fshowthread.php%3F553261以瞭解該頁面上廣泛的HTML錯誤列表)。

所以PHP基本上必須猜測它提供的HTML是什麼意思,並警告(可能會猜錯)。

的&是在HTML中的特殊字符,用來轉義特殊字符(例如在一個HTML頁面打印<你必須寫& LT ;.它還在網址中有特殊的意義作爲分隔符對於請求變量(如http://example.com?foo=bar&braz=omfg),因此出現了很多網站。寫在HTML中&正確的方法是&放;.

大概的猜測是正確的,DOM文檔會工作得很好。所以你可以只像這樣抑制這個警告:

@$dom->loadHTML($html); 

否則,你必須以某種方式修復HTML。只要運行它通過上述ヶ輛是行不通的,因爲它也將逃避所有標籤標誌等

什麼可能會工作替換所有&與 &放大器;雖然這可能會導致其他後果,如& amp;會變成& amp; amp;所以你只能替換那些沒有放大器的&。

+0

爲什麼isn'雖然有效的HTML如果它是一個網站?只有&會產生問題嗎? –

+0

HTML是具有一定規則的標準,並且該網站不遵循規則(請參閱http://validator.w3.org/check?verbose=1&uri=http%3A%2F%2Fforums.heroesofnewerth.com%2Fshowthread.php %3F553261爲什麼錯了)。 HTML解析器基本上是通過猜測來解決錯誤的HTML問題。這就是爲什麼該網站仍然有效。 –

+0

增加了一些關於爲什麼&對於答案是特殊的信息。 –