DOM loadhtml извлекает узлы и дочерние узлы

У меня есть список элементов, в которых мне нужно получить атрибут заголовка списка, URL-адрес ссылки и отображаемый текст ссылки, а также значение диапазона каждого тега списка.

<ul>
<li class="testclass" title="Title 1 goes here">
<a href="http://examplelink1.com">List Text 1</a>
<span>Second List Text 1</span>
</li>
<li class="testclass" title="Title 2 goes here">
<a href="http://examplelink2.com">List Text 2</a>
<span>Second List Text 2</span>
</li>
</ul>

Как я могу извлечь каждый отдельный тег списка и его значения с помощью foreach (так как мне нужно вставить значения в базу данных MySQL впоследствии (каждое значение в отдельном поле базы данных).

Пока что я могу получить их отдельно:

<?php
$doc = new DOMDocument();
@$doc->loadHTML($list);
$imageTags = $doc->getElementsByTagName('a');
foreach($imageTags as $tag) {
$link = $tag->getAttribute('href');
echo $link.'<br/>';
}
?>

А также

<?php
$doc = new DOMDocument();
@$doc->loadHTML($list);
$imageTags = $doc->getElementsByTagName('li');
foreach($imageTags as $tag) {
$link = $tag->getAttribute('title');
echo $link.'<br/>';
}
?>

Я нашел скрипт с xpath, но я не знаю, как правильно его применять, чтобы получить нужные мне значения и использовать их в операторе MySQL:

<?php
$dom = new DOMdocument();
@$dom->loadHTML($list);
$xpath = new DOMXPath($dom);
$elements = $xpath->query("//*");
foreach ($elements as $element) {
echo "<p>". $element->nodeName. "</p>";
$nodes = $element->childNodes;
foreach ($nodes as $node) {
echo $node->nodeValue. "<br/>";
}
}
?>

1

Решение

использование DOMXPath::evaluate(), Это часть ext/dom и позволяет использовать выражения XPath для извлечения узлов и значений из DOM.

$dom = new DOMDocument();
$dom->loadHtml($html);
$xpath = new DOMXPath($dom);

// use an xpath expression to fetch the li nodes
foreach ($xpath->evaluate('//ul/li[@class="testclass"]') as $li) {
var_dump(
[
// this is a direct attribute of the li node, use dom method
'title' => $li->getAttribute('title'),
// more complex, use an xpath expression
'href' => $xpath->evaluate('string(a/@href)', $li),
// Cast the node to a string to return the text content
'link-text' => $xpath->evaluate('string(a)', $li),
// works for the span, too
'description' => $xpath->evaluate('string(span)', $li)
]
);
}

Выход:

array(4) {
["title"]=>
string(17) "Title 1 goes here"["href"]=>
string(23) "http://examplelink1.com"["link-text"]=>
string(11) "List Text 1"["description"]=>
string(18) "Second List Text 1"}
array(4) {
["title"]=>
string(17) "Title 2 goes here"["href"]=>
string(23) "http://examplelink2.com"["link-text"]=>
string(11) "List Text 2"["description"]=>
string(18) "Second List Text 2"}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]