@Shimpanze

Новый запрос XPath относительно предыдущего запроса XPath?

Здравствуйте!

Есть примерная структура:

$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;


Необходимо получить из неё все элементы 'article' - с этим проблем нет:

$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>


Буду благодарен за помощь!
  • Вопрос задан
  • 174 просмотра
Решения вопроса 1
DevMan
@DevMan
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;
	}
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы