2015-01-13 4 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

Что такое строка 30 в index.php? – 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 странице вы должны написать & л ;. Она также имеет особое значение в URL-адресов в качестве разделителя для переменных запроса (например, http://example.com?foo=bar&braz=omfg) и, таким образом, появляется много сайтов. правильный способ написать & внутри HTML является & амп ;.

Вероятно догадки правильны и DOMDocument будет работать нормально. Так что вы могли бы просто прервите это предупреждение так:

@$dom->loadHTML($html); 

В противном случае вам придется как-то исправить HTML. Просто работает через htmlentities, как упоминалось выше, не будет работать, так как это будет также избежать всех маркеров тегов и т.д.

Что, вероятно, могли бы работать на замену всех & с & усилителя; хотя это может привести к другим последствиям: & amp; будет & amp; amp; поэтому вам придется заменить только те & s, за которыми не следует усилитель.

+0

Почему isn ' t это действительный HTML, если это веб-сайт? И только & порождает проблемы? –

+0

HTML - это стандарт с определенными правилами и что веб-сайт не соответствует правилам (см. Http://validator.w3.org/check?verbose=1&uri=http%3A%2F%2Fforums.heroesofnewerth.com%2Fshowthread.php % 3F553261, что не так). Парсеры HTML в основном построены для того, чтобы обойти неправильный HTML, угадывая. Вот почему сайт по-прежнему работает. –

+0

Добавил немного информации о том, почему & является особенным для ответа. –