Я пытаюсь проанализировать некоторый 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>
Теперь я пытаюсь получить только отделение с идентификатором 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
, и используйте его для запроса элемента, который вы хотите получить:
$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
string '<div id="double">
<img src="http://images.example.com/double.gif" width="300" height="27" border="0" alt="" title="">
</div>
' (length=125)
Теперь,вы просто должны делать с ним все, что хотите; -)
From DomDocument :: getElementById
Чтобы эта функция работала, вы должны необходимо либо установить некоторые атрибуты идентификатора с DOMElement :: setIdAttribute или DTD, который определяет атрибут, который должен быть типа ID. В последнем случае вы нужно будет подтвердить ваш документ с DOMDocument :: validate или DOMDocument-> validateOnParse перед с помощью этой функции.
Для получения дополнительной информации
И поскольку кто-то упомянет выполнение этого с помощью обычного Выражение рано или поздно, вот шаблон, который вы могли бы использовать: Кроме того, вы могли бы просто использовать обычные строковые функции для извлеките часть div, например . Хотя я согласен, вам не следует использовать функции RegEx или String для синтаксического анализа HTML или XML, я считаю, что это абсолютно нормально, , пока ваш единственный забота состоит в том, чтобы получить этот единственный div из фрагментов. Будьте проще. /
$div = strstr($html, '<div id="double">');
$div = substr($div, 0, strpos($div, '</div>') + 6);
echo $div;
HTML Tidy должен быть способен "исправлять" сломанные и фрагментированные HTML-документы, превращая их во что-то, что можно анализировать с помощью других инструментов
http://devzone.zend.com/article / 761
Расширение Tidy является новым в PHP 5, и доступен с версии PHP 5.0b3 вверх. Он основан на библиотеке TidyLib и позволяет разработчика для проверки, ремонта и анализировать HTML, XHTML и XML документы из PHP.
XML-документ может иметь только один элемент на корневом уровне. Возможно, у парсера HTML есть подобное требование. Попробуйте заключить содержимое в тег
.
Кажется, это что-то еще. На этой странице описывается, что может быть причиной. Я бы рекомендовал вам использовать XPath для получения элемента.
Фрагмент - это HTML, но для анализа через DOM он должен XHTML. Каждый открытый тег должен быть закрыт.
В вашем случае это означает, что вы должны заменить
на
и
с