Аналог JQuery на PHP

Для работы с объектами DOM HTML на PHP есть очень удобная библиотека phpQuery - это аналог JQuery, с точно таким же синтаксисом. Скачать phpQuery version 0.9.5, с этой версией работал я.

Принцип работы

По началу, конечно, не привычно работать с этой библиотекой, но когда понимаешь, насколько библиотека повторяет JQuery, плюс можно пользоваться всей мощью php - становишься просто счастлив.

Синтаксис JQuery: $(ОБЪЕКТ).КОМАНДА

Синтаксис phpQuery: pq(ОБЪЕКТ)->КОМАНДА

Таким образом, все отличие заключается в использовании функции pq вместо $, ну и к командам нужно обращаться через -> а не точку(.).

Пример

Задача: нужно получить курсы валют некого банка. Курсы возможно брать с сайта банка. Т.е. нужно распарсить страницу. Код страницы:


<html> 
    <body>
        <p>Курсы валют</p>
        <table>
            <tr><td>Валюта</td><td>Курс</td></tr>
            <tr><td>EUR</td><td>40</td></tr>
            <tr><td>USD</td><td>30</td></tr>
            <tr><td>UAN</td><td>20</td></tr>
        </table>
    </body>
</html>

Решение:


include $_SERVER['DOCUMENT_ROOT'].'phpQuery.php';
$pageText = file_get_contents($path);
//Создаем корневой объект phpQuery
//$document = phpQuery::newDocumentHTML($pageText,'UTF8');//С указание кодировки
$document = phpQuery::newDocumentHTML($pageText); //Без указания кодировки
$arTr = pq($document)->find('tr:gt(0)');//Получаем все строки, начиная со второй
$res = array(); 
foreach ($arTr as $tr){//цикл по строкам
    $currency = pq($tr)->find('td:eq(0)')->html();//берем название валюты
                                                  //из первой ячейки
    $res[$currency] = pq($tr)->find('td:eq(1)')->html(); //курс из второй
}

Получили:


Array
(
    [EUR] => 40
    [USD] => 30
    [UAN] => 20
)

Обращаю внимание на одну странность. Создавать корневой объект phpQuery можно как с указанием кодировки ($document = phpQuery::newDocumentHTML($pageText,'UTF8');), так и без ($document = phpQuery::newDocumentHTML($pageText);). В каких то случаях, если не указать кодировку - получим казюбрики вместо кириллицы. А иногда, наоборот, указываешь правильную кодировку - получаешь казюбрики, а не указываешь кодировку - все нормально. Я с причинами не разбирался, просто определял опытным путем где указывать кодировку, а где нет.

Еще пример

Также, с помощью данной библиотеки можно менять HTML содержимое. Возьмем HTML код из предыдущего примера, и добавим класс первой строке таблицы:


pq($document)->find('tr:eq(0)')->addClass('table-head');
echo pq($document)->html();

Получим:


<html> 
    <body>
        <p>Курсы валют</p>
        <table>
            <tr class="table-head"><td>Валюта</td><td>Курс</td></tr>
            <tr><td>EUR</td><td>40</td></tr>
            <tr><td>USD</td><td>30</td></tr>
            <tr><td>UAN</td><td>20</td></tr>
        </table>
    </body>
</html>

В примерах используются JQuery селекторы :eq() и :gt() подробнее о них и других селекторах можно прочитать здесь.

Комментарии:

Максим

12.10.2013 16:12:12

Спасибо большое!!!, Очень помогли, только текст пришлось получать с помощью curl, а то так не работает...

Radoslav

23.03.2015 18:39:20

Проблема кодировки зависит от 3 параметров:
1 - кодировка исходной страницы (документ в котором будет идти поиск)
2 - кодировка сервера.
3 - кодировка скрипта

Кодировка скрипта желательно должна совпадать с кодировкой сервера. Это становится единым параметром к которому надо приводить получаемый для работы документ

Оставить комментарий:

Представьтесь пожалуйста:
Электронная почта:
Электронный адрес не публикуются
Текст сообщения:
Для подсветки кода, оборачивайте ваш код в теги <code></code>
Введите 5 цифр с картинки:

Рекомендую:

Поддержать проект:

бесполезная кнопка, которую еще никто не нажал:)
Нажали! Кнопку нажали уже 7 человек!!! Спасибо, очень мотивирует!