Как обрабатывать частичный 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;
Ответы
Ответ 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 ... />