Answer the question
In order to leave comments, you need to log in
New XPath query relative to previous XPath query?
Hello!
There is an example structure:
$html = <<<'HTML'
<main>
<article style="margin-left: 0px;">
<div class="content">
<span>Без ссылки</span>
</div>
</article>
<article style="margin-left: 10px;">
<div class="content">
<span>
<a href="http://site.com/1">Ссылка 1</a>
</span>
</div>
</article>
<article style="margin-left: 20px;">
<div class="content">
<span>
<a href="http://site.com/2">Ссылка 2</a>
<a href="http://site.com/3">Ссылка 3</a>
</span>
<span>
<a href="http://site.com/4">Ссылка 4</a>
</span>
</div>
</article>
</main>
HTML;
$dom = new DOMDocument;
@$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DomXPath($dom);
$articles = $xpath->query('//main/article');
foreach ($articles as $article) {
// ...
}
foreach ($articles as $article) {
// ВАЖНО: тут что-то делаю с найденным 'article'
// Как мне здесь написать новый запрос XPath
// но уже внутри каждого найденного ранее $article?
// В данном случае, получить ПЕРВУЮ ссылку внутри каждого 'article' и вывести её:
// <a href="http://site.com/1">Ссылка 1</a>
// и
// <a href="http://site.com/2">Ссылка 2</a>
// Поскольку результат (ссылка) будет единственным, как обойтись без ещё одного foreach?
// чего перебирать-то, результат же один...
// то есть, не DOMNodeList, а DOMElement (наверное, насколько я понимаю)
// Пробовал так:
// Создаю новый запрос (ищу первую ссылку)
$query = '//div/span/a[1]';
// ...запрос внутри ранее найденного $article - вернуть только первый
$el = $xpath->evaluate($query, $article)->item(1);
// ну и вывести результат (ничего не выводит)
echo $el->ownerDocument->saveHTML($el);
}
<a href="http://site.com/1">Ссылка 1</a>
<a href="http://site.com/2">Ссылка 2</a>
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question