Подтвердить что ты не робот

Как обрабатывать частичный HTML?

Я пытаюсь разобрать HTML с DOM в PHP, но у меня возникают некоторые проблемы. Во-первых, в случае, если это изменит решение, HTML, который у меня есть, - это не полная страница, а скорее только его часть.

<!-- This is the HTML that I have --><a href='/games/'>
<div id='game'>
<img src='http://images.example.com/games.gif' width='300' height='137' border='0'>
<br><b> Game </b>
</div>
<div id='double'>
<img src='http://images.example.com/double.gif' width='300' height='27' border='0' alt='' title=''>
</div>
</a>

Теперь я пытаюсь получить только div с id double. Я пробовал следующий код, но он, похоже, не работает должным образом. Что я могу делать неправильно?

//The HTML has been loaded into the variable $html
$dom=new domDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false; 
$keepme = $dom->getElementById('double'); 

$contents = '<div style="text-align:center">'.$keepme.'</a></div>';
echo $contents;
4b9b3361

Ответ 1

Я думаю, DOMDocument::getElementById не будет работать в вашем случае: (цитирование)

Чтобы эта функция работала, вы будете необходимо либо установить некоторые атрибуты идентификатора с DOMElement::setIdAttribute или DTD, который определяет атрибут идентификатора типа.
В более позднем случае вы вам нужно будет подтвердить свой документ с помощью DOMDocument::validate или DOMDocument->validateOnParse до используя эту функцию.


Решение, которое может работать, использует некоторый запрос XPath для извлечения элемента, который вы ищете.

Прежде всего, загрузите часть HTML, как вы это делали раньше:

$dom=new domDocument;
$dom->loadHTML($html);
var_dump($dom->saveHTML());

var_dump здесь только для того, чтобы доказать, что часть HTML была загружена успешно - судя по ее результату, она имеет.


Затем создайте класс DOMXPath и используйте его для запроса элемента, который вы хотите получить:

$xpath = new DOMXpath($dom);
$result = $xpath->query("//*[@id = 'double']");
$keepme = $result->item(0);

Теперь нам нужен элемент, который вы хотите; -)


Но для того, чтобы добавить HTML-контент в другой сегмент HTML, мы должны сначала получить его содержимое HTML.

Я не помню никакого "легкого" способа сделать это, но что-то вроде этого может сделать трюк:

$tempDom = new DOMDocument();
$tempImported = $tempDom->importNode($keepme, true);
$tempDom->appendChild($tempImported);
$newHtml = $tempDom->saveHTML();
var_dump($newHtml);

И... У нас есть HTML-контент вашего double <div>:

string '<div id="double">
<img src="http://images.example.com/double.gif" width="300" height="27" border="0" alt="" title="">
</div>
' (length=125)


Теперь вы просто должны делать все, что хотите, -)

Ответ 2

Из DomDocument::getElementById

Чтобы эта функция работала, вы будете необходимо либо установить некоторые атрибуты идентификатора с DOMElement:: setIdAttribute или DTD, который определяет атрибут идентификатора типа. В более позднем случае вы вам нужно будет подтвердить свой документ с DOMDocument:: проверка или DOMDocument- > validateOnParse перед используя эту функцию.

Для получения дополнительной информации

И так как кто-то упомянет об этом с помощью регулярного выражения раньше или позже, вот шаблон, который вы могли бы использовать: /<div id='double'>(.*)<\/div>/simU

Кроме того, вы можете просто использовать регулярные строковые функции для извлечения div-части, например.

$div = strstr($html, '<div id="double">');
$div = substr($div, 0, strpos($div, '</div>') + 6);
echo $div;

В то время как я согласен, вам не следует использовать функции RegEx или String для разбора HTML или XML, я нахожу абсолютно все в порядке, если только ваша проблема состоит в том, чтобы получить этот единственный div из фрагментов. Держите его простым.

Ответ 3

HTML Tidy должен быть способен "исправлять" разбитые и фрагментированные HTML-документы, превращая их во что-то, что можно проанализировать с помощью других инструментов

http://devzone.zend.com/article/761

Расширение Tidy является новым в PHP 5, и доступен из версии PHP 5.0b3 вверх. Он основан на библиотеке TidyLib и позволяет разработчик для проверки, ремонта и анализировать HTML, XHTML и XML-документы изнутри PHP.

Ответ 4

XML-документ может содержать только один элемент на корневом уровне. Вероятно, у парсера HTML есть аналогичное требование. Попробуйте обернуть содержимое тегом <body/>.

Кажется, это что-то еще. Эта страница описывает, что может быть причиной. Я бы рекомендовал использовать XPath для получения элемента.

Ответ 5

Фрагмент - это HTML, но для его анализа через DOM он должен XHTML. Каждый открытый тег должен быть закрыт.

В вашем случае это означает, что вы должны заменить <br> на <br /> и <img ... > на <img ... />