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, nuDOMHTMLDocument, iar elementele suntDom\Element, nuDOMElement.
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.