phpQuery – parser HTML z api jQuery
- Mateusz Żeromski | 2008-08-31 | Ciekawostki Php javascript
Ostatnio coś mnie drgnęło, aby sprawdzić czy są jakieś nowości w php dotyczące parsowania plików html. Ku mojemu pozytywnemu zaskoczeniu znalazłem pewną bibliotekę, która jest dość dynamicznie rozwijana. Posiada API z jQuery, dzięki czemu używanie jej jest bezbolesne dla tych którzy znają ten framework js. Otóż jest to phpQuery :).
Ale co to jest?
Jakiś czas temu na blogu porównałem parsery php i python. Okazało się, że php jest do tych celów kiepski. I od tamtej pory co jakiś czas sprawdzałem czy nic nowego w tym temacie się nie pojawiło. Znalazłem bibliotekę phpQuery, opis jej pojawił się 29 lipca w dokumentacji php http://pl2.php.net/dom
Nazwa oczywiście pochodzi od jQuery, oznacza to że te dwie biblioteki mają coś wspólnego – mianowicie API. Tak, teraz możemy poruszczać się po dokumencie w php tak jak to było w jQuery. Aktualnie brakuje paru fajnych rzeczy, np.: selektorów “:fisrt”, “:last” itp.
Jak to działa?
Działa prawie jak jQuery tylko zamiast “$” używa się “pq” :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php // just one file to include require('phpQuery/phpQuery.php'); // intialize new DOM from markup phpQuery::newDocument('<div>mydiv<ul><li>1</li><li>2</li><li>3</li></ul></div>') ->find('ul > li') ->addClass('my-new-class') ->filter(':last') ->addClass('last-li'); // query all unordered lists in last used DOM pq('ul')->insertAfter('div'); // iterate all LIs from last used DOM foreach(pq('li') as $li) { // iteration returns plain DOM nodes, not phpQuery objects pq($li)->addClass('my-second-new-class'); } // same as pq('anything')->htmlOuter() but on document root (returns doctype etc) print phpQuery::getDocument(); ?> |
Uwaga!
Ładując dane do phpQuery, oznacza pakowanie ich w “DOMDocument class”. Tutaj jest jedno zastrzeżenie. Czasem na stronach specjalne znaki są wypisywanie kodami html co powoduje, że później podczas parsowania danych pojawiają się krzaki a nie polskie literki. Jest na to sposób, należy użyć funkcji mb_convert_encoding :)
1 2 3 4 5 6 7 8 | <?php require('phpQuery/phpQuery.php'); $htmlCode = file_get_contents('http://example.com'); $htmlCode= mb_convert_encoding($htmlCode, 'HTML-ENTITIES', "UTF-8"); // intialize new DOM from markup phpQuery::newDocument($htmlCode); //...... ?> |
Podsumowanie
Po zastosowaniu tej metody w projekcie uważam, że jest ona genialna :). Autorem jest Polak Tobiasz Cudnik :). Z dokumentacji dostępnej na googleCode można wywnioskować, że phpQuery powstaje od jakiegoś roku, i ciągle się rozwija (25 sierpnia pojawiła się kolejna wersja), co jest bardzo dobrą wiadomością. Polecam więc używanie tej metody bo jak narazie nie zauważyłem niedogodności związanych z użytkowaniem.
Linki
Tagi: Ciekawostki, jquery, php