PHP Simple HTML DOM Parser: jak jednoduše zpracovat HTML v PHP

Ze světa JavaScriptu určitě znáte knihovnu jQuery, která, mimo jiné, umožňuje velmi jednoduše přistupovat k určitým prvkům ve struktuře stránky HTML. V PHP nic tak pohodlného standardně není - tedy dokud nevyužijete bezplatný PHP Simple HTML DOM Parser.

K čemu vůbec používat nějaký HTML parser v PHP? Představte si situaci, kdy na své webové stránce potřebujete zpracovat data z jiného webu, z jiné adresy. Jako zdroj dat budete mít pouze HTML strukturu, pro její zpracování budete moci použít jazyk PHP.

Z obdržené HTML struktury budete chtít vypreparovat například nějaký DIV či jiný prvek s určitým ID nebo s nějakou třídou. Zároveň potřebujete zajistit, abyste obdrželi jen takový prvek s požadovanou třídou, který je zanořen v určité struktuře.

Pokud byste něco takového dělali s pomocí JavaScriptu a jQuery, bylo by to velmi jednoduché, stačilo by napsat $('selector') a hned byste obdrželi požadovaný prvek. Pro příklad:

$('#obsah div.teloobsahu').val('<p>Tady je nové HTML pro <strong>tělo obsahu</strong></p>');

Výše uvedený kód v jQuery zajistí, že DIV se třídou teloobsahu zanořený v elementu s ID obsah obdrží nový HTML kód. Z původního

<div id="obsah"><div class="teloobsahu">tady je původní obsah</div></div>

tak v prohlížeči po spuštění uvedeného kódu v jQuery vznikne následující:

<div id="obsah"><div class="teloobsahu"><p>Tady je nové HTML pro <strong>tělo obsahu</strong></p></div></div>

Proč použít PHP?

Uvedené řešení v jQuery se snadno zapisuje, ale ne vždy vám bude vyhovovat. V různých situacích potřebujete zpracovat data již na straně serveru a do prohlížeče uživateli odeslat již hotové HTML. Třeba ve zmíněném případě, kdy má skript stáhnout HTML kód z jiné webové stránky, vypreparovat z něj určitý prvek a ten vložit do vaší HTML struktury.

V PHP byste hledání prvků v HTML struktuře mohli řešit použitím různých regulárních výrazů a funkce preg_match(). Přiznám se, že sestrojování regulárních výrazů absolutně nesnáším. Kde je to nezbytné, sahám po prográmku RegexBuddy.

Nedávno jsem ale objevil povedený PHP Simple HTML DOM Parser. S jeho pomocí lze ke struktuře HTML kódu přistupovat podobně, jako s využitím jQuery. Jen to budete mít v PHP.

Jak pracovat s PHP Simple HTML DOM Parserem?

PHP Simple HTML DOM Parser jen připojíte do svého kódu a můžete začít používat jeho syntaxi pro přístup k HTML struktuře. Koukněme se na příklad, který je uveden na domovských stránkách tohoto nástroje:

$html = file_get_html('http://www.google.com/');
foreach($html->find('img') as $element)
       echo $element->src . '<br>';
foreach($html->find('a') as $element)
       echo $element->href . '<br>';

Pomocí funkce file_get_html() nejprve načtete zdrojový kód ze zadané webové adresy, v tomto případě z Google. Následuje ukázka použití smyčky foreach, ve které je postupně vypisován zdrojový kód všech značek IMG ze získané HTML struktury. Ve druhé smyčce jsou podobně vypsány všechny odkazy.

Výběr prvků se tedy s využitím PHP HTML DOM Parseru realizuje následovně:

$html->find('selektor');

...přičemž selektorem je zápis udávající označení prvků, jejich ID nebo tříd. Takže například:

$ret = $html->find('div[id=obsah]'); - vrátí DIV s ID odpovídajícím řetězci obsah
$ret = $html->find('div[id]'); - vrátí všechny DIVy s jakýmkoli ID
$ret = $html->find('[id]'); - vrátí všechny elementy, které mají nastaveno ID

Místo ID můžete samozřejmě použít class, prvky lze za sebou řadit postupně tak, jak je chcete nalézt zanořené v HTML struktuře, tedy podobně jako v jQuery. Speciálním zápisem můžete říci, že vás zajímá jen Ntý prvek odpovídající hledání:

$poradi = 1;

$ret = $html->find('div[class=teloobsahu]', $poradí);

Stejně pohodlně můžete s nalezenou větví HTML struktury dále pracovat. Takže pokud byste chtěli změnit její obsah, můžete tak učinit následovně:

$html->find('div[class=teloobsahu]', 0)->innertext = '<p>Tady je nové HTML pro <strong>tělo obsahu</strong></p>';

Takto byste tedy řešili zadání naznačené v jQuery na začátku článku, zde přímo v PHP. Samozřejmě je potřeba počítat s tím, že změny realizujete pouze v proměnné obsahující kompletní HTML strukturu ze získané adresy. Upravený kód nebo jeho části musíte někam vypsat nebo uložit. S tím si ale už poradíte.

Simple HTML DOM Parser toho umí mnohem více, doporučuji kouknout do jeho online dokumentace a především na kompletní výčet jeho API.

Simple HTML DOM Parser a Drupal

Na závěr ještě dobrá zpráva pro Drupalisty. K dispozici máme modul nazvaný simplehtmldom API, který zmíněný parser do Drupalu doplňuje. Modul stačí tedy zapnout a ihned můžete ve svém kódu (tedy ve vlastních modulech nebo PHP obsahu/blocích) s parserem pracovat, není třeba nějaké další includování.

Zde je jednoduchá ukázka, která stáhne kód ze zadané adresy, vypreparuje z něj určitý element a takto získaným HTML nahradí obsah DIVu s konkrétním ID v určitém uzlu. Následně upravenou podobu uzlu uloží. Upozorňuji, že v následujícím kódu kvůli srozumitelnosti není žádné ošetření vstupů, takže může být potenciálně nebezpečný:

  $html = file_get_html('http://nejakaadresa.cz/stranka.php');

  $tabulka = $html->find('div[class=telostranky] table' , 0);

  $node = node_load($cislouzlu);

  $nodehtml = str_get_html($node->body['cs'][0]['value']);

  $nodehtml->find('div[id=tabulkovadata]' , 0)->innertext = $tabulka;

  $newhtml = $nodehtml->save();

  $node->body['cs'][0]['value'] = $newhtml;

  node_save($node);

  $nodehtml->clear();

  unset($nodehtml);

Tagy

Buďme ve spojení, přihlaste se k newsletteru

Odesláním formuláře souhlasíte s podmínkami zpracováním osobních údajů. 
Více informací v Ochrana osobních údajů.

Autor článku: Jan Polzer

Tvůrce webů z Brna se specializací na Drupal, WordPress a Symfony. Acquia Certified Developer & Site Builder. Autor několika knih o Drupalu.
Marketing Director v Lesensky.cz. Ve volných chvílích podnikám výlety na souši i po vodě. Více se dozvíte na polzer.cz a mém LinkedIn profilu.

Komentáře k článku

návštěvník

no problém je že treba vubec nikde v manualu se nepise nic o jeho instalaci a o tom kam vlozit include atd... napriklad pokud ho vlozim do souboru function ve wordpressu, nic se neukaze a hodi to chybu 500... proste zase jenom pro profiky a nic pro normální lidi: include_once('simple_html_dom.php'); = error 500 , docela rad bych si s tím pohrál ale zatím to na to moc nevidim...

Profile picture for user Jan Polzer

No jo, vývojářská věc to je. Čili nic pro klikače. Pokud byste to chtěl zkoušet v Drupalu, je na to modul. Zda je přímo plugin pro WordPress, to nevím, ale asi bych začal tím, že pro něj udělám speciální pluginek, kde to napojím. A nebudu to rvát do šablony, ne?

Přidat komentář

Odesláním komentáře souhlasíte s podmínkami Ochrany osobních údajů

reklama
Moje kniha o CMS Drupal

 

Kniha 333 tipů a triků pro Drupal 9


Více na KnihyPolzer.cz

Sledujte Maxiorla na Facebooku

Maxiorel na Facebooku

Poslední komentáře
Hosting pro Drupal a WordPress

Hledáte český webhosting vhodný nejenom pro redakční systém Drupal? Tak vyzkoušejte Webhosting C4 za 1200 Kč na rok s doménou v ceně, 20 GB prostoru a automatické navyšováním o 2 GB každý rok. Podrobnosti zde.

@maxiorel na Twitteru

Maxiorel na Twitteru