Метод closest класса Crawler
Метод closest класса Crawler возвращает новый объект Crawler, содержащий ближайший родительский элемент, который соответствует заданному CSS-селектору. Поиск начинается с текущего узла и поднимается вверх по дереву DOM. Первым параметром передаётся строка с CSS-селектором. Если подходящий предок не найден, возвращается пустой Crawler.
Синтаксис
public function closest(string $selector): Crawler
Пример
Давайте создадим объект Crawler из HTML-строки и найдём ближайшего предка для ссылки:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DomCrawler\Crawler;
class ArticleController extends AbstractController
{
public function index(): Response
{
$html = '<div class="wrapper"><section class="content"><a href="/user">link</a></section></div>';
$crawler = new Crawler($html);
$link = $crawler->filter('a');
$parent = $link->closest('.content');
return new Response($parent->html());
}
}
?>
Результат выполнения кода:
<a href="/user">link</a>
Пример
Давайте проверим, что будет, если подходящий предок не найден:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DomCrawler\Crawler;
class ArticleController extends AbstractController
{
public function index(): Response
{
$html = '<div class="wrapper"><a href="/user">link</a></div>';
$crawler = new Crawler($html);
$link = $crawler->filter('a');
$parent = $link->closest('.missing');
return new Response((string) $parent->count());
}
}
?>
Результат выполнения кода:
0
Пример
Давайте найдём ближайшего предка с тегом section на нескольких уровнях вложенности:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DomCrawler\Crawler;
class ArticleController extends AbstractController
{
public function index(): Response
{
$html = '<section class="outer"><div class="inner"><span>text</span></div></section>';
$crawler = new Crawler($html);
$span = $crawler->filter('span');
$parent = $span->closest('section');
return new Response($parent->attr('class'));
}
}
?>
Результат выполнения кода:
"outer"