Можно ли выполнить поиск по регулярному выражению с помощью Symfony Dom crawler?
Dom Crawler Component является мощным для анализа html-контента, в его документации описаны основные варианты выбора (например, filter('body > p')
) или более сложный как xpath //span[contains(@id, "article-")]
Можно ли получить элементы по регулярному выражению? Может быть, что-то подобное доступно: filter('body')->filter('div.*-timeLabel-*')
?
2 ответа
Что-то вроде этого? Изменен один из примеров из документации с применением анонимной функции.
$nodeValues = $crawler->filter('body')->each(function (Crawler $node, $i) {
// regex and return $node->attr('class')
});
Я не уверен, но я думаю, что ответ да, потому что метод фильтра сканера вызывает этот метод CssSelectorConverter
и в соответствии с документацией вы можете передать выражение в качестве параметра
/**
* Translates a CSS expression to its XPath equivalent.
*
* Optionally, a prefix can be added to the resulting XPath
* expression with the $prefix parameter.
*
* @param string $cssExpr The CSS expression
* @param string $prefix An optional prefix for the XPath expression
*
* @return string
*/
public function toXPath($cssExpr, $prefix = 'descendant-or-self::')
{
return $this->translator->cssToXPath($cssExpr, $prefix);
}
В XPath 2.0 можно использовать совпадения:
$crawler->filterXPath("//div[matches(@id, '*-timeLabel-*')]");
но если у вас этого нет, лучше всего попробовать объединить некоторые другие методы XPath, например, это должно помочь в вашем случае:
$crawler->filterXPath("//div[contains(@id, '*-timeLabel-*')]");