Intereting Posts
strtotime («Первый понедельник ..»), когда в первый день месяца возвращается неверная дата PHP: преобразовать пробелы в строку в% 20? Почему мы должны использовать статические вызовы в PHP? Как я могу получить ошибку при запуске нескольких запросов с помощью PDO? Предоставление данных в файл XML Как я могу заставить этот скрипт работать в WordPress? Функции по ссылке или переменной, которые следует использовать когда? Вставка изображения несколько раз в зависимости от разницы между двумя номерами. PHP jQuery (или любой веб-инструмент) Вложенный редактор выражений Как проверить, соответствует ли текущая дата / время заданной дате / времени? Как получить значение языка из $ _SERVER с помощью PHP? зарегистрировать js для определенной страницы в script-calls.php PHP не столь фатальные ошибки с "новым SoapClient ()" Проблема с форматированием почты PHP. Почему заканчиваются строки заголовка CRLF в HTML-письме в Outlook? Отображать каждое значение поля DISTINCT только один раз, используя цикл

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

Я пытаюсь разобрать 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.

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

  • Упростить PHP DOM XML-анализ – как?
  • Как вы анализируете и обрабатываете HTML / XML в PHP?

И так как кто-то упомянет об этом с помощью регулярного выражения раньше или позже, вот шаблон, который вы могли бы использовать: /<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 ... />