Я пытаюсь разобрать HTML с DOM в PHP, но у меня возникают некоторые проблемы. Во-первых, в случае, если это изменит решение, HTML, который у меня есть, – это не полная страница, скорее, это только часть его.
<!-- This is the HTML that I have --><a href='/games/'> <div id='game'> <img src='http://img.ruphp.com/php/games.gif' width='300' height='137' border='0'> <br><b> Game </b> </div> <div id='double'> <img src='http://img.ruphp.com/php/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;
Я думаю, что DOMDocument::getElementById
не будет работать в вашем случае: (цитирование)
Чтобы эта функция работала, вам нужно либо установить некоторые идентификационные атрибуты с помощью
DOMElement::setIdAttribute
либо DTD, который определяет атрибут типа ID.
В более позднем случае перед использованием этой функции вам необходимо будет подтвердить свой документ с помощьюDOMDocument::validate
илиDOMDocument->validateOnParse
.
Решением, которое может работать, является использование некоторого запроса XPath для извлечения элемента, который вы ищете.
Прежде всего, давайте загрузим часть HTML, как вы это делали раньше:
$dom=new domDocument; $dom->loadHTML($html); var_dump($dom->saveHTML());
var_dump
здесь только для того, чтобы доказать, что часть HTML была загружена успешно – судя по ее выходу, она имеет.
Затем DOMXPath
класс 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://img.ruphp.com/php/double.gif" width="300" height="27" border="0" alt="" title=""> </div> ' (length=125)
Теперь вам просто нужно делать все, что вы хотите 😉
Из DomDocument::getElementById
Чтобы эта функция работала, вам нужно либо установить некоторые идентификационные атрибуты с помощью DOMElement :: setIdAttribute, либо DTD, который определяет атрибут типа ID. В более позднем случае перед использованием этой функции вам необходимо будет подтвердить свой документ с помощью DOMDocument :: validate или 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 из фрагментов. Будь проще.
HTML Tidy должен быть способен «исправлять» разбитые и фрагментированные HTML-документы, превращая их во что-то, что может быть проанализировано с помощью других инструментов
http://devzone.zend.com/article/761
Расширение Tidy является новым в PHP 5 и доступно с версии PHP 5.0b3 вверх. Он основан на библиотеке TidyLib и позволяет разработчику проверять, исправлять и анализировать HTML, XHTML и XML-документы из PHP.
XML-документ может содержать только один элемент на корневом уровне. Вероятно, у парсера HTML есть аналогичное требование. Попробуйте обернуть содержимое <body/>
.
Кажется, это что-то еще. На этой странице описывается, что может быть причиной. Я бы рекомендовал использовать XPath для получения элемента.
Фрагмент – это HTML, но для его разбора через DOM он должен XHTML. Каждый открытый тег должен быть закрыт.
В вашем случае это означает, что вы должны заменить на <br />
и <img ... >
с помощью <img ... />