Dom\HTMLDocument în PHP

Citește HTML5 corect (ca un browser) și caută elemente cu selectori CSS: querySelector și querySelectorAll.

Sintaxă
Dom\HTMLDocument::createFromString(string $source, int $options = 0, ?string $overrideEncoding = null): Dom\HTMLDocument
Dom\HTMLDocument::createFromFile(string $path, int $options = 0, ?string $overrideEncoding = null): Dom\HTMLDocument

Ce face Dom\HTMLDocument

Vechea clasă DOMDocument folosea un parser HTML 4, care nu înțelege corect etichetele HTML5 și strică textul UTF-8 fără declarație de codare. Dom\HTMLDocument, din PHP 8.4, folosește un parser conform standardului HTML5 (biblioteca Lexbor), deci citește pagina la fel ca un browser.

Clasa are metodele cunoscute din JavaScript: querySelector() și querySelectorAll() cu selectori CSS, textContent, getAttribute(). saveHtml() scrie documentul înapoi ca HTML.

Pentru a ascunde mesajele parserului despre HTML incorect, transmite opțiunea LIBXML_NOERROR.

Parametri

Parametru Descriere
$source / $path Codul HTML, respectiv calea fișierului HTML.
$options Opțiuni libxml, de exemplu LIBXML_NOERROR.
$overrideEncoding Opțional. Codarea folosită dacă documentul nu o declară corect.

Ce returnează

Un obiect Dom\HTMLDocument.

Exemple

Exemplul 1: Extragerea prețurilor cu selectori CSS

<?php
$html = <<<HTML
<ul id="produse">
  <li class="produs"><span class="nume">Pâine</span> <span class="pret">5,50 lei</span></li>
  <li class="produs"><span class="nume">Lapte</span> <span class="pret">7,20 lei</span></li>
</ul>
HTML;

$doc = Dom\HTMLDocument::createFromString($html, LIBXML_NOERROR);

foreach ($doc->querySelectorAll("#produse .produs") as $li) {
    $nume = $li->querySelector(".nume")->textContent;
    $pret = $li->querySelector(".pret")->textContent;
    echo "$nume: $pret\n";
}

Rezultat

Pâine: 5,50 lei
Lapte: 7,20 lei

Exemplul 2: HTML incomplet, completat ca în browser

<?php
$doc = Dom\HTMLDocument::createFromString('<p class="nota">Salut, <b>Ana</b><p>Al doilea paragraf', LIBXML_NOERROR);

echo count($doc->querySelectorAll("p")) . " paragrafe\n";
echo $doc->querySelector("p.nota b")->textContent . "\n";
echo $doc->saveHtml();

Rezultat

2 paragrafe
Ana
<html><head></head><body><p class="nota">Salut, <b>Ana</b></p><p>Al doilea paragraf</p></body></html>

Greșeli frecvente

  • Continui să folosești DOMDocument::loadHTML() pentru pagini HTML5: diacriticele pot apărea stricate și etichetele noi generează avertismente.
  • Uiți prefixul de namespace: clasa este Dom\HTMLDocument, nu DOMHTMLDocument, iar elementele sunt Dom\Element, nu DOMElement.

Comenzi înrudite

  • htmlspecialchars: Transformă caracterele speciale HTML în entități, ca textul să fie afișat în siguranță în pagină.
  • strip_tags: Elimină etichetele HTML și PHP dintr-un text, păstrând doar conținutul.
  • get_meta_tags: Citește etichetele <meta name=”…” content=”…”> dintr-un fișier sau dintr-o pagină web și le returnează ca tablou.
  • file_get_contents: Citește tot conținutul unui fișier (sau al unei adrese URL) într-un text.