Удобная библиотека если нужно вытащить какой ни будь часть HTML кода с сайта нам поможет специальная библиотека, позволяющие упростить разбор HTML. Их представителем является phpQuery.
Библиотека phpQuery аналог jQuery, с которой многие хорошо знакомы. Вместо того, чтобы писать сложные регулярки для получения блоков сайта, с помощью phpQuery мы сможем обращаться к ним с помощью селекторов CSS.
Данная библиотека представляет собой класс и для того, чтобы понять работу с нею, нужно хоть немного представлять что такое ООП.
Начало работы с phpQuery
Официальная документация (англ.) находится по ссылке http://code.google.com/archive/p/phpquery/ или можете скачать у на с сайта. Зайдите туда, скачайте эту библиотеку, положите в папку со своим проектом и подключите ее вот так:
<?php require_once 'phpQuery/phpQuery/phpQuery.php'; ?>
Примеры работы с phpQuery
Работа с phpQuery происходит подобно jQuery. Впрочем, даже не зная jQuery вам будет легко разобраться.
Итак, начало работы с библиотекой начинается с phpQuery::newDocument($str), где переменная $str — это HTML код для разбора. В результате вернется объект, к которому мы сможем применять определенные методы:
<?php require_once 'phpQuery/phpQuery/phpQuery.php'; $sttag = '<div class="titan"><a href="https://sv-pt.ru">Сылка</a></div><div>Теги</div>'; $pq = phpQuery::newDocument($sttag); ?>
Итак, в переменной $pq лежит объект. У этого объекта есть метод find, который параметром принимает CSS селектор, а делает следующее: ищет внутри HTML кода из $pq элементы подпадающие под этот селектор. Пример:
<?php require_once 'phpQuery/phpQuery/phpQuery.php'; $sttag = '<div class="titan"><a href="https://sv-pt.ru">Сылка</a></div><div>Теги</div>'; $pq = phpQuery::newDocument($sttag ); $elem = $pq->find('a'); ?>
Сейчас в переменной $elem лежит объект с найденным a ( ссылка ) У этого объекта есть метод html, который выводит параметры ссылки найденного элемента:
<?php require_once 'phpQuery/phpQuery/phpQuery.php'; $sttag = '<div class="titan"><a href="https://sv-pt.ru">Сылка</a></div><div>Теги</div>'; $pq = phpQuery::newDocument($sttag); $elem = $pq->find('#elem'); $text = $elem->html(); echo $text; ?>
Получение атрибутов
Кроме содержимого тегов, можно также получать содержимое атрибутов. Можно получить 2 способами. Это делает метод attr, параметром принимающий название атрибута. Давайте получим содержимое href ссылки:
- Способ:
<?php require_once 'phpQuery/phpQuery/phpQuery.php'; $sttag = '<div class="titan"><a href="https://sv-pt.ru">Сылка</a></div><div>Теги</div>'; $html = phpQuery::newDocument($sttag ); $pq = pq($html); $elem = $pq->find('a'); $href = $elem->attr('href'); echo $href; ?>
2. Способ: Сокращается код на одну строчку
<?php require_once 'phpQuery/phpQuery/phpQuery.php'; $sttag = '<div class="titan"><a href="https://sv-pt.ru">Сылка</a></div><div>Теги</div>'; $html = phpQuery::newDocument($sttag); $pq = pq($html); $href = $pq->find('a')->attr('href'); echo $href; ?>
Работа с набором элементов
Предположим, что мы хотим получить не один элемент по его id, а несколько. Давайте попробуем сделать так:
<?php require_once 'phpQuery/phpQuery/phpQuery.php'; $sttag = '<div class="titan"><a href="https://sv-pt.ru">Сылка</a></div><div class="titan"><a href="https://sv-pt.ru">Сылка 2</a></div><div>Теги</div>'; $pq = phpQuery::newDocument($sttag); $links = $pq->find('a'); $text = $links->html(); echo $href; ?>
В результате мы увидим строку Сылка и Сылка 2 — содержимое двух ссылок слитое в одну строку. Врятли мы хотели получить именно это — нам наверняка хотелось бы иметь массив текстов ссылок и массив их href.
В данном случае переменная $links — объект, состоящий из набора других объектов. Такие объекты можно перебирать циклом foreach — и это будет работать. Вот так:
<?php require_once 'phpQuery/phpQuery/phpQuery.php'; $sttag = '<div class="titan"><a href="https://sv-pt.ru">Сылка</a></div><div class="titan"><a href="https://sv-pt.ru">Сылка 2</a></div><div>Теги</div>'; $pq = phpQuery::newDocument($sttag ); $links = $pq->find('a'); foreach ($links as $link) { } ?>
Внутри цикла переменная $link будет объектом, однако не объектом phpQuery, а объектом DOM. Это значит, что к $link не применимы методы phpQuery (в частности find и html). Чтобы сделать из него объект phpQuery, его следует обернуть в функцию pq (аналог доллара в jQuery).
Давайте сделаем это и заодно накопим тексты ссылок и их href в отдельные массивы:
<?php require_once 'phpQuery/phpQuery/phpQuery.php'; $sttag = '<div class="titan"><a href="https://sv-pt.ru">Сылка</a></div><div class="titan"><a href="https://sv-pt.ru">Сылка 2</a></div><div>Теги</div>'; $pq = phpQuery::newDocument($sttag ); $links = $pq->find('a'); foreach ($links as $link) { $pqLink = pq($link); //pq делает объект phpQuery $text[] = $pqLink->html(); $href[] = $pqLink->attr('href'); } echo($text); echo($href); ?>
Удаление
С помощью phpQuery можно удалять по селектору мешающие вам элементы. Это делается с помощью метода remove. Смотрите пример:
<?php require_once 'phpQuery/phpQuery/phpQuery.php'; $sttag = '<div class="titan"><a href="https://sv-pt.ru">Сылка</a></div><div class="titan"><a href="https://sv-pt.ru">Сылка 2</a></div><div>Теги</div>'; $pq = phpQuery::newDocument($sttag ); $elem = $pq->remove('div.titan); $text = $pq->html(); echo $text; ?>
В результате остается только блок <div>Текст</div>, а блок <div class=»titan»> с вложением удаляется.
Оборачивание
Можно также оборачивать элементы с помощью метода wrap. Смотрите пример:
<?php require_once 'phpQuery/phpQuery/phpQuery.php'; $sttag = '<div class="titan"><a href="https://sv-pt.ru">Сылка</a></div><div class="titan"></div><span id="wrap">Теги</span>'; $pq = phpQuery::newDocument($sttag ); $wrap = $pq->find('#wrap')->wrap('<div>'); $text = $pq->html(); echo $text; ?>
В результате ссылка обернется в див и станет выглядеть так: <div><span id=»wrap»>Ссылка</span></div>.
Оборачивание внутрь
<?php require_once 'phpQuery/phpQuery/phpQuery.php'; $sttag = '<div class="titan"><a href="https://sv-pt.ru">Сылка</a></div><div class="titan"></div><span id="wrap">Теги</span>'; $pq = phpQuery::newDocument($sttag ); $wrap = $pq->find('#wrap')->wrapInner('<b>'); $text = $pq->html(); echo $text; ?>