Как исключить html комментарии из текстового узла xpath? - PullRequest
4 голосов
/ 03 апреля 2019

У меня следующая html-структура:

<a>
    <div>
        <div>
            <span>
                text node 1<br>
                text node 2  <!--//comments-->
            </span>
        </div> 
    </div>
</a>

С помощью следующего запроса я получаю второй узел, но как получить этот узел без комментариев?

$spanx = $xpath->query('//a/div/div/span/text()[2]');
$span = $spanx->item($l)->nodeValue;
echo "<td>".$span."</td></tr>";

У меня есть этот результат:

text node 2 //comments

Я ищу:

text node 2

1 Ответ

3 голосов
/ 07 апреля 2019

Я проверял следующее на своем локальном хосте.Я создал файл с именем DOM_with_comment.html, содержащий:

<a>
    <div>
        <div>
            <span>
                text node 1<br>
                text node 2  <!--//comments-->
            </span>
        </div> 
    </div>
</a>

Когда я запускаю:

<?php
$doc = new DOMDocument;
libxml_use_internal_errors(true);
$doc->preserveWhiteSpace = false;
$doc->loadHTMLFile('DOM_with_comment.html');
$xpath = new DOMXPath($doc);
echo "<pre>";
foreach ($xpath->query('//a/div/div/span/text()') as $item) {
    var_dump($item->nodeValue);
}

Выходные данные:

string(29) "
                text node 1"
string(31) "
                text node 2  "
string(14) "
            "

Таким образом, при обращении к первому квалифицируемому результату [0] из вашего запроса xpath с последующим отображением trim() ed ->nodeValue() с var_export() обнаруживается, что по обе стороны целевой подстроки нет комментариев или пробелов.

var_export(trim($xpath->query('//a/div/div/span/text()[2]')[0]->nodeValue));
// outputs: 'text node 2'

ps Если вы вводите не файл, а переменную, это работает так же:

$html = <<<HTML
<a>
    <div>
        <div>
            <span>
                text node 1<br>
                text node 2  <!--//comments-->
            </span>
        </div> 
    </div>
</a>
HTML;
$doc->loadHTML($html);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...