Сегодня вы узнаете о простейшем HTML DOM парсере на PHP. Данный скрипт написан на PHP5+, поддерживает невалидную HTML разметку, и самое главное, с ним очень просто работать.
Описание, Требования & Особенности
- HTML DOM парсер, написанный на PHP5+, позволяет очень просто управлять структурой и данными HTML!
- Для работы скрипта требуется установленный PHP 5+.
- Есть поддержка невалидного HTML кода.
- Есть возможность обращаться к селекторам на странице, как в jQuery.
- Присутствует возможность извлекать содержимое HTML в одну строку.
Быстрый старт
[w2hideshow]
-
Как получить HTML элемент?
12345678910// Создаем DOM из URL или файла$html = <strong>file_get_html</strong>('http://www.google.com/');// Находим все картинкиforeach($html-><strong>find</strong>('img') as $element)echo $element-><strong>src</strong> . '<br>';// Находим все ссылкиforeach($html-><strong>find</strong>('a') as $element)echo $element-><strong>href</strong> . '<br>'; -
Как изменить HTML элементы?
12345678// Создаем DOM из строки$html = <strong>str_get_html</strong>('<div id="hello">Hello</div><div id="world">World</div>');$html-><strong>find</strong>('div', 1)-><strong>class</strong> = 'bar';$html-><strong>find</strong>('div[id=hello]', 0)-><strong>innertext</strong> = 'foo';echo $html; // Вывод: <div id="hello"><strong>foo</strong></div><div id="world" <strong>class="bar"</strong>>World</div> -
Извлечение содержимого из HTML
12// Дамп содержимого (без тэгов) из HTMLecho <strong>file_get_html</strong>('http://www.google.com/')-><strong>plaintext</strong>; -
Зачистка Slashdot!
123456789101112// Создаем DOM из URL$html = <strong>file_get_html</strong>('http://slashdot.org/');// Находим все блоки articleforeach($html-><strong>find</strong>('div.article') as $article) {$item['title'] = $article-><strong>find</strong>('div.title', 0)-><strong>plaintext</strong>;$item['intro'] = $article-><strong>find</strong>('div.intro', 0)-><strong>plaintext</strong>;$item['details'] = $article-><strong>find</strong>('div.details', 0)-><strong>plaintext</strong>;$articles[] = $item;}print_r($articles);
Как создать HTML DOM объект?
-
Быстрый способ
123456789// Создаем DOM объект из строки$html = <strong>str_get_html</strong>('<html><body>Hello!</body></html>');// Создаем DOM объект из URL$html = <strong>file_get_html</strong>('http://www.google.com/');// Создаем DOM объект из HTML файла$html = <strong>file_get_html</strong>('test.htm'); -
Объектно-ориентированный способ
1234567891011// Создаем DOM объект$html = new <strong>simple_html_dom</strong>();// Загружаем HTML из строки$html-><strong>load</strong>('<html><body>Hello!</body></html>');// Загружаем HTML из URL$html-><strong>load_file</strong>('http://www.google.com/');// Загружаем HTML из HTML файла$html-><strong>load_file</strong>('test.htm');
Как найти HTML элементы?
-
Основы
1234567891011121314// Находим все <strong>анкоры</strong>, возвращая <strong>массив</strong> элементов объектов$ret = $html->find('<strong>a</strong>');// Находим <strong>(N)-ый</strong> <strong>анкор</strong>. На выходе получаем объект или <strong>null</strong>, если такой анкор не будет найден$ret = $html->find('<strong>a</strong>', <strong>0</strong>);// Находим <strong>последний</strong> <strong>анкор</strong>. На выходе получаем объект или <strong>null</strong>, если такой анкор не будет найден$ret = $html->find('<strong>a</strong>', <strong>-1</strong>);// Находим все <strong><div></strong> с атрибутом <strong>id</strong>$ret = $html->find('<strong>div[id]</strong>');// Находим все <strong><div></strong> с атрибутом <strong>id=foo</strong>$ret = $html->find('<strong>div[id=foo]</strong>');
Как получить доступ к атрибутам HTML?
-
Получение, Установка и Удаление атрибутов
123456789101112// <strong>Получение</strong> атрибута (Если у атрибута <strong>нет значения</strong> (например. checked, selected...), то ответ будет <strong>true</strong> или <strong>false</strong>)$value = $e-><strong>href</strong>;// <strong>Установка</strong> атрибута (Если у атрибута <strong>нет значения</strong> (например. checked, selected...), то ответ будет <strong>true</strong>, при удачной вставке, или <strong>false</strong>, при неудачной )$e-><strong>href</strong> = 'my link';// <strong>Удаление</strong> атрибута исполняется через установку его значения в null!$e-><strong>href</strong> = <strong>null</strong>;// <strong>Определение</strong> существования атрибутаif(isset($e-><strong>href</strong>))echo 'href exist!'; -
Магические атрибуты
123456789101112131415161718192021222324252627282930// Пример$html = str_get_html("<div>foo <b>bar</b></div>");$e = $html->find("div", 0);echo $e-><strong>tag</strong>; // Вернет: " <strong>div</strong>"echo $e-><strong>outertext</strong>; // Вернет: " <strong><div>foo <b>bar</b></div></strong>"echo $e-><strong>innertext</strong>; // Вернет: " <strong>foo <b>bar</b></strong>"echo $e-><strong>plaintext</strong>; // Вернет: " <strong>foo </strong><strong>bar</strong>"<table cellspacing="1" cellpadding="1"><thead><tr><th width="25%">Имя атрибута</th><th width="75%">Использование</th></tr><tbody><tr><td>$e-><strong>tag</strong></td><td>Чтение или запись <strong>tag name</strong> элемента.</td></tr><tr><td>$e-><strong>outertext</strong></td><td>Чтение или запись <strong>внешнего HTML текста</strong> элемента.</td></tr><tr><td>$e-><strong>innertext</strong></td><td>Чтение или запись <strong>внутреннего HTML текста</strong> элемента.</td></tr><tr><td>$e-><strong>plaintext</strong></td><td>Чтение или запись <strong>простого текста</strong> элемента.</td></tr></tbody></thead></table> -
Советы
1234567891011121314// <strong>Извлечение</strong> содержимого HTMLecho <strong>$html</strong>-><strong>plaintext</strong>;// <strong>Оборачивание</strong> элемента$e-><strong>outertext</strong> = '<div>' . $e-><strong>outertext</strong> . '<div>';// <strong>Удаление</strong> элемента выполнятся следующим образом, устанавливаете его внешнему тексту значение пустой строки$e-><strong>outertext</strong> = '';// <strong>Добавление</strong> элемента$e-><strong>outertext</strong> = $e-><strong>outertext</strong> . '<div>foo<div>';// <strong>Вставка</strong> элемента$e-><strong>outertext</strong> = '<div>foo<div>' . $e-><strong>outertext</strong>;
Как обойти DOM дерево?
-
Основы
123456// Если вы не знакомы с HTML DOM, то дополнительную информацию можно найти <a href="http://php.net/manual/en/book.dom.php" target="_blank">здесь (eng.)</a>...// Примерecho $html-><strong>find</strong>("#div1", 0)-><strong>children</strong>(1)-><strong>children</strong>(1)-><strong>children</strong>(2)->id;// илиecho $html-><strong>getElementById</strong>("div1")-><strong>childNodes</strong>(1)-><strong>childNodes</strong>(1)-><strong>childNodes</strong>(2)-><strong>getAttribute</strong>('id'); -
Обход DOM дерева
Информацию по всем методам вы можете получитьздесь .Метод Описание mixed$e->children ( [int $index] )Возвращает N-ый объект потомка, если установлен index, иначе возвращает массив элементов. element$e->parent ()Возваращает родительский элемент. element$e->first_child ()Возвращает элемент первого потомка, или null, если элемент не будет найден. element$e->last_child ()Возвращает элемент последнего потомка, или null, если элемент не будет найден. element$e->next_sibling ()Возвращает следующий соседний элемент, или null, если не будет такой найден. element$e->prev_sibling ()Возвращает предыдущий соседний элемент, или null, если не бидет такой найден.
Как сделать дамп содержимого DOM объекта?
-
Простой способ
12345// Дамп внутреннего DOM дерева обратно в строку$str = $html;// Печатаем!echo $html; -
Объектно-ориентированный способ
12345// Дамп внутреннего DOM дерева обратно в строку$str = $html-><strong>save</strong>();// Дамп внутреннего DOM дерева обратно в файл$html-><strong>save</strong>('result.htm');
Как настроить поведение парсинга?
-
Обратные функции
123456789101112// Написание функции с параметром "<strong>$element</strong>"function my_callback($element) {// Прячем все <b> тэгиif ($element->tag=='b')$element->outertext = '';}// Регистрация функции обратного вызова с <strong>именем my_callback</strong>$html-><strong>set_callback</strong>('my_callback');// Функция обратного вызова запустится при дампеecho $html;