Поиск ссылок, соответствующих заданной строке в запросе xpath / domdocument - PullRequest
2 голосов
/ 09 марта 2011

Проблемы с получением ссылок, соответствующих заданному слову, для отображения с использованием Xpath и domDocument.Кажется, все работает до того места, где используется for($i=0;$i<$documentLinks->length;$i++){.

Может кто-нибудь помочь с тем, где я иду не так?

$html  = '<ol>';
$html .= '  <li id="stuff-123"> some copy here </li>';
$html .= '  <li id="stuff-456"> some copy here <a href="http://domain.com">domain</a> </li>';
$html .= '  <li id="stuff-789"> some copy here </li>';
$html .= '</ol>';


    $dom = new DOMDocument();
    $dom->loadHTML($html);
    $xpath = new DOMXPath($dom); 
    $result = $xpath->query('//ol/li[starts-with(@id, "stuff")]');
    foreach($result as $e){
        $documentLinks = $e->getElementsByTagName('a')->item(0)->nodeValue;
        for($i=0;$i<$documentLinks->length;$i++){
            $documentLink = $documentLinks->item($i);
            if(preg_match("/domain/i", $documentLink->getAttribute("href"))){
              echo $documentLink->getAttribute("href") . "\n";
            }
        }
    }

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Вы можете получить атрибут href напрямую через XPath

//ol/li[starts-with(@id, "stuff")]/a[contains(@href, "domain")]/@href

, а затем просто сделайте

foreach($result as $href){
    echo $href->nodeValue;
}

Обратите внимание, что функция contains чувствительна к регистру.

1 голос
/ 09 марта 2011

Строка: $documentLinks = $e->getElementsByTagName('a')->item(0)->nodeValue;

, вероятно, должна быть: $documentLinks = $e->getElementsByTagName('a');


$e->getElementsByTagName('a')

возвращает всех дочерних элементов $ e с тегом <a ...>, что означает, что

$e->getElementsByTagName('a')->item(0);

возвращает первую ссылку в $ e

, а $documentLinks = $e->getElementsByTagName('a')->item(0)->nodeValue; возвращает текст этой первой ссылки.

http://php.net/manual/en/domdocument.getelementsbytagname.php

...