PHP XPath возвращает слишком много элементов - PullRequest
0 голосов
/ 20 августа 2010

Я пытаюсь использовать XPath в PHP и получаю слишком много элементов. Это мой код:

libxml_use_internal_errors(true);
$document = new DOMDocument;
$document->strictErrorChecking = false;
$document->loadHTML($text);
$xpath = new DomXPath($document);
$placeholders = $xpath->query('//div[starts-with(@class, "waf-ph-")]');
print '$placeholders->length: ' . $placeholders->length;

Существует только ОДИН элемент, соответствующий запросу. Один. Ни одного больше. Но вот мой вывод:

$placeholders->length: 7

Я использую loadHTML, потому что у меня не будет полного контроля над вводом, когда я закончу кодирование, и я не могу гарантировать соответствие XHTML стандартам. Я собираюсь использовать Tidy, но пока стараюсь не полагаться на него. Но есть только ОДИН div, который соответствует XPath.

Дальнейшие исследования показывают, что это тот же самый элемент, который был найден семь раз.

Что происходит?

Редактировать: источником файла DOM является файл HTML, который где-то содержит следующее (это фиктивный адрес):

<div class="waf-ph-https\:\/\/aserver\.com\/apath\/app\.php5">
  <p class="notification">This is to be substituted.</p>
</div>

Строка "waf-ph-" больше нигде не найдена в файле.

Edit:

Попытка сделать следующее:

foreach ($document->placeholders as $node) print $document->saveXML($node);

возвращает текст вышеуказанного DIV семь раз.

Ответы [ 2 ]

1 голос
/ 20 августа 2010

Если я использую фрагмент, который вы дадите, я получу один результат.

Для этого XML:

$text = <<< XML
<root>
    <div class="waf-ph-1"></div>
    <div class="waf-ph-2"></div>
    <div class="waf-ph-3"></div>
    <div class="waf-ph-4"></div>
</root>
XML;

вы получите четыре матча за данный XPath.

Для этого XML:

$text = <<< XML
<root>
    <div class="waf-ph-1"></div>
    <div class="wbf-ph-2"></div>
    <div class="wcf-ph-3"></div>
    <div class="wdf-ph-4"></div>
</root>
XML;

вы получите только один. Ваш код правильный. Это должен быть ваш HTML. Также обратите внимание, что //div будет соответствовать любому <div> независимо от его положения в документе. Следующий XML также вернет 4 найденных узла для вашего кода:

$text = <<< XML
<root>
    <div class="waf-ph-1">
        <div class="waf-ph-2">
            <div class="waf-ph-3">
                <div class="waf-ph-4">
    </div></div></div></div>
</root>
XML;
0 голосов
/ 26 сентября 2010

Комментарий ircmxaell об использовании spl_object_hash() действительно решил мою проблему и показал, что на этот раз компилятор (или интерпретатор) действительно был виноват. Он должен получить кредит на этот вопрос. Если не считать этого, я пишу этот ответ, чтобы отдать ему должное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...