DOMXPath / DOMDocument - получение элементов div в блоке комментариев
Допустим, у меня есть этот блок комментариев, содержащий HTML:
<html>
<body>
<code class="hidden">
<!--
<div class="a">
<div class="b">
<div class="c">
<a href="link">Link Test 1</a>
</div>
<div class="c">
<a href="link">Link Test 2</a>
</div>
<div class="c">
<a href="link">Link Test 3</a>
</div>
</div>
</div>
-->
</code>
<code>
<!-- test -->
</code>
</body>
</html>
Используя DOMXPath для PHP, как мне получить ссылки и текст внутри тега?
Это то, что я до сих пор:
$dom = new DOMDocument();
$dom->loadHTML("HTML STRING"); # not actually in code
$xpath = new DOMXPath($dom);
$query = '/html/body/code/comment()';
$divs = $dom->getElementsByTagName('div')->item(0);
$entries = $xpath->query($query, $divs);
foreach($entries as $entry) {
# shows entire text block
echo $entry->textContent;
}
Как мне перейти, чтобы я мог получить классы "c" и затем поместить ссылки в массив?
РЕДАКТИРОВАТЬ Обратите внимание, что есть несколько <code>
теги на странице, поэтому я не могу просто получить элемент с code
приписывать.
1 ответ
Решение
Вы уже можете настроить таргетинг на комментарий, содержащий ссылки, просто следуйте по нему и сделайте еще один запрос внутри него. Пример:
$sample_markup = '<html>
<body>
<code class="hidden">
<!--
<div class="a">
<div class="b">
<div class="c">
<a href="link">Link Test 1</a>
</div>
<div class="c">
<a href="link">Link Test 2</a>
</div>
<div class="c">
<a href="link">Link Test 3</a>
</div>
</div>
</div>
-->
</code>
</body>
</html>';
$dom = new DOMDocument();
$dom->loadHTML($sample_markup); # not actually in code
$xpath = new DOMXPath($dom);
$query = '/html/body/code/comment()';
$entries = $xpath->query($query);
foreach ($entries as $key => $comment) {
$value = $comment->nodeValue;
$html_comment = new DOMDocument();
$html_comment->loadHTML($value);
$xpath_sub = new DOMXpath($html_comment);
$links = $xpath_sub->query('//div[@class="c"]/a'); // target the links!
// loop each link, do what you have to do
foreach($links as $link) {
echo $link->getAttribute('href') . '<br/>';
}
}