Метод each класса Crawler
Метод each класса Crawler перебирает все узлы,
найденные в DOM-дереве, и для каждого узла вызывает
переданную callback-функцию. Первым параметром передаётся
замыкание, которое получает узел DOMNode, его позицию
i и объект Crawler. Метод возвращает массив
результатов, собранных из возвращаемых значений callback.
Синтаксис
$crawler->each(function (DOMNode $node, int $i, Crawler $crawler) {
// ...
});
Пример
Давайте переберём все ссылки на странице и соберём их адреса в массив:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DomCrawler\Crawler;
use DOMNode;
class ArticleController extends AbstractController
{
public function index(): Response
{
$html = '
<a href="/user">user</a>
<a href="/article">article</a>
<a href="/hello">hello</a>
';
$crawler = new Crawler($html);
$res = $crawler->filter('a')->each(function (DOMNode $node, int $i, Crawler $crawler) {
return $node->getAttribute('href');
});
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
["/user","/article","/hello"]
Пример
Давайте соберём текст каждого абзаца вместе с его порядковым номером:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DomCrawler\Crawler;
use DOMNode;
class ArticleController extends AbstractController
{
public function index(): Response
{
$html = '
<p>abcde</p>
<p>article</p>
<p>hello</p>
';
$crawler = new Crawler($html);
$res = $crawler->filter('p')->each(function (DOMNode $node, int $i, Crawler $crawler) {
return $i . ':' . $node->textContent;
});
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
["0:abcde","1:article","2:hello"]
Пример
Давайте соберём массив сущностей из строк таблицы:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DomCrawler\Crawler;
use DOMNode;
class ArticleController extends AbstractController
{
public function index(): Response
{
$html = '
<tr>
<td>article</td>
<td>text</td>
<td>1</td>
<td>true</td>
</tr>
';
$crawler = new Crawler($html);
$res = $crawler->filter('tr')->each(function (DOMNode $node, int $i, Crawler $crawler) {
return [
'title' => $crawler->filter('td')->eq(0)->text(),
'body' => $crawler->filter('td')->eq(1)->text(),
'count' => (int) $crawler->filter('td')->eq(2)->text(),
'active' => (bool) $crawler->filter('td')->eq(3)->text(),
];
});
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"title":"article","body":"text","count":1,"active":true}]