Можно ли выполнить поиск по регулярному выражению с помощью 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-*')]");
Другие вопросы по тегам