Возникают проблемы с получением ссылок, соответствующих заданному слову, с помощью 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"; } } }
Строка: $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
Вы можете получить атрибут href напрямую через XPath
//ol/li[starts-with(@id, "stuff")]/a[contains(@href, "domain")]/@href
а затем просто сделайте
foreach($result as $href){ echo $href->nodeValue; }
Обратите внимание, что функция contains
регистр с учетом регистра.