S
S
Shimpanze2018-10-01 05:27:09
PHP
Shimpanze, 2018-10-01 05:27:09

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;

You need to get all the 'article' elements from it - no problem with that:
$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) {
  // ...
}

Question:
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);
}

The output should be:
<a href="http://site.com/1">Ссылка 1</a>
<a href="http://site.com/2">Ссылка 2</a>

I will be grateful for your help!

Answer the question

In order to leave comments, you need to log in

1 answer(s)
D
DevMan, 2018-10-01
@Shimpanze

foreach ($articles as $article) {
  $query = 'div/span[1]/a[1]';
  $el = $xpath->evaluate($query, $article);
  if( $el->length ) {
    echo $dom->saveHTML($el->item(0)), PHP_EOL;
  }
}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question