Jakiś czas temu odkryłem bardzo ciekawą bibliotekę – phpQuery. Czym ona jest ? Przedewszystkim jest to biblioteka pozwalająca na wyciąganie elementów HTMLa (po stronie PHP), za pomocą selektorów CSS.
Czy to się przydaje? Owszem, nawet bardzo. Przykładowych zastosowań jest wiele. My to wykorzystaliśmy przykładowo do “poprawiania” podczas zapisu embedowanych filmów z YT. Problem polegał na tym, że w dokumencie xHTML 1.1 Transitional nie można używać elementów . Firefox i Opera sobie z tym radziły, IE natomiast sypał się i krzyczał, że nie może załadować strony.
Jak trzeba było to rozwiązać ? Musieliśmy pobrać z elementu
<?php
$xml = phpQuery::newDocument($data_fields['code']);
phpQuery::selectDocument($xml);
if($xml['object embed']->length() > 0) {
$type = $xml['object embed']->attr('type');
$data_src = $xml['object embed']->attr('src');
$xml['object']->attr('data', $data_src)->attr('type', $type);
$xml['object param[name=movie]']->attr('value', $data_src);
$xml['object embed']->remove();
$data_fields['code'] = $xml->htmlOuter();
}
?>
Wydaje się proste, prawda? Zalet jest wiele, wypunktuję najważniejsze:
- pobieranie elementów strony za pomocą selektorów CSS
- manipulowanie tymi elementami (dodawanie klas, stylow)
- pobieranie atrybutów wybranych elementów.
- iteracja na wielu elementach
- możliwość tworzenia nowych elementów, zastępowania starych oraz wyplucie tego wszystkiego jako HTML
- można nawet stworzyć za jego pomocą całego HTMLa (coś na zasadzie new Element(‘div’))
Jakie dalsze plusy?
- łatwa obsługa – naprawdę w bardzo łatwy sposób można pobrać dowolny element, oraz modyfikować je. Wystarczy odrobinkę znać składnię jQuery, ale jest to bardzo intuicyjne
- w szybki sposób można “naprawiać” stronę (chociażby problemy z embedowanymi filmami YT)
- szybko możemy modyfikować dane, bez używania skomplikowanych regexpów/etc
- możemy parsować nie tylko HTMLa, praktycznie każdy XML przejdzie
Możliwości tej biblioteki są naprawdę spore. Pamiętajmy jednak, że nie zawsze dobrze jest wystawiać armatę przeciw komarowi. Ze względu na swój rozmiar może się okazać, że lepiej będzie użyć jakiś natywnych klas, które szybciej sobie poradzą z naszym problemem.
2 Komentarze
Jak chcesz to w lżejszy sposób zrobić, bez “overhead-a” ciężkiego liba, możesz użyć czystego DOMDocument i XPath. Dopasowanie węzłów HTML-a via XPath ma co prawda trochę inną składnię, ale jest ona dość dobrze wyjaśniona tu: http://plasmasturm.org/log/444/ . Możesz się też pokusić o napisanie prostego konwertera selektorów CSS na XPath. Odkąd zacząłem operować DOMDocument-em do przetwarzania HTML-a powrotu do “tag soup” już nie było. Przetwarzanie HTML-a regexami to ślepa uliczka.
Adam: masz rację. Czasami o wiele lepiej jest korzystać z wymienionych przez Ciebie sposobów. W zasadzie można również skorzystać z SimpleXML.
Ogólnie to zależy od tego do czego chcesz wykorzystać dany skrypt. Mnie phpQuery przydało się kiedy właśnie chciałem po selektorach łapać elementy. XPath jest jakimś rozwiązaniem, ale na skrypty typu Q&D daje phpQuery daje rade :)