Kcko
10/25/2018 - 7:57 AM

PHP DOM examples

<?php


/ Bez tohoto volání při načítání HTML5 vyskakují podobné chyby:
// Warning:  DOMDocument::loadHTML(): Tag header invalid in Entity
libxml_use_internal_errors(true);

$data = file_get_contents("test.html");

$dom = new DOMDocument();
$dom->loadHtml(mb_convert_encoding($data, 'HTML-ENTITIES', 'UTF-8'));
$finder = new DomXPath($dom);


// Elementy
$nodesByElement = $finder->query("//a");       # CSS: a
$nodesByElement = $finder->query("//a/span");  # CSS: a > span
$nodesByElement = $finder->query("//a//span"); # CSS: a span

// ID a atributy
$nodeById = $finder->query("//*[@id='testId']");   # CSS: #testId
$nodeById = $finder->query("//div[@id='testId']"); # CSS: div#testId
$nodeByAttr = $finder->query("//*[@data-city]");   # CSS: [data-city]

// Třídy - těch může být více v jednom atributu, trochu se to komplikuje
// CSS: .inactive
$classToFind = "inactive";
$byClass = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' ".$classToFind." ')]");

// XPath se v těchto případech nechová úplně stejně jako CSS
$byIndex = $finder->query("//div/a[2]");      # CSS: div > a:nth-child(2)
$lastNode = $finder->query("//div/a[last()]");# CSS: div > a:last-child

// Vyhledávání pouze v dříve vyhledaném elementu
$finder->query("//a", $nodeById);

// Rodič, potomci, předchozí sourozenec, následující sourozenec
// POZOR: Počítá i TextNode
$parentNode = $nodeById->item(0)->parentNode;
$previousSibling = $nodeById->item(0)->previousSibling;
$nextSibling = $nodeById->item(0)->nextSibling;
$children = $nodeById->item(0)->childNodes;


// Získání kusu HTML nalezeného selektorem
$htmlPart = $dom->saveHtml($nodeById->item(0));

//Získání hodnotu atributu
$linkNode->item(0)->getAttribute("href");

// Změnu atributu
$linkNode->item(0)->setAttribute("href", "/");

// Smazání tagu img, který je přímým potomkem
$toRemove = $finder->query("img", $nodeList->item(2));
$removedItem = $nodeList->item(2)->removeChild($toRemove->item(0));

//Vložení nového (nyní odstraněného) elementu
$nodeList->item(0)->appendChild($removedItem);