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/>';
    }
}
Другие вопросы по тегам