Компонент CssSelector

Компонент CssSelector преобразует селекторы CSS в выражения XPath.

Установка

1
$ composer require symfony/css-selector

Также вы можете клонировать репозиторий https://github.com/symfony/css-selector.

Note

If you install this component outside of a Symfony application, you must require the vendor/autoload.php file in your code to enable the class autoloading mechanism provided by Composer. Read this article for more details.

Применение

Эта статья объясняет как использовать функции CssSelector как независимого компонента в любом приложении PHP. Прочитайте статью Функциональные тесты Symfony для понимания как использовать его при создании тестов Symfony.

Зачем использовать селекторы CSS?

Когда вы анализируете HTML или XML документ, наиболее мощным методом для этого является XPath.

Выражения XPath невероятно гибкие, так что почти всегда существует выражение XPath, которое найдёт нужный вам элемент. К сожалению, они также могут стать очень сложными, и обучение им непростое. Даже общие операци (например, поиск элемента с определённым классом), может требовать длинных и неупорядоченных выражений.

Многие разработчики -- особенно веб-разработчики -- больше всего любят использовать селекторы CSS для поиска элементов. Так же, как и работа с таблицами стилей, селекторы CSS используются в JavaScript с функцией querySelectorAll() и в популярных JavaScript библиотеках, вроде jQuery, Prototype и MooTools.

CSS селекторы менее мощные, чем XPath, но намного проще в написании, прочтении и понимании. Так как оии менее мощные, почи все селекторы CSS могут быть преобразованы в эквивилент XPath. Это выражение XPath может быть использовано с другими функциями и классами, использующими XPath, чтобы найти элементы в документе.

Компонент CssSelector

Единственная цель компонента - преобразовывать селекторы CSS в их эквиваленты XPath, используя toXPath():

1
2
3
4
use Symfony\Component\CssSelector\CssSelectorConverter;

$converter = new CssSelectorConverter();
var_dump($converter->toXPath('div.item > h4 > a'));

Это даёт следующий вывод:

1
descendant-or-self::div[@class and contains(concat(' ',normalize-space(@class), ' '), ' item ')]/h4/a

Вы можете использовать это выражение с, к примеру, DOMXPath или SimpleXMLElement, чтобы найти элементы в документе.

Tip

Метод Crawler::filter() использует компонент CssSelector, чтобы найти элеметы, основанные на строке CSS селектора. См. The DomCrawler Component, чтобы узнать больше.

Ограничения компонента CssSelector

Не все CSS селекторы могут быть преобразованы в эквиваленты XPath.

Вот некоторые CSS селекторы, которые имеют смысл только в контексте веб-браузера.

  • селекторы состояния ссылки: :link, :visited, :target
  • селекторы, основанные на действии пользователя: :hover, :focus, :active
  • селекторы состояния UI: :invalid, :indeterminate (однако, :enabled, :disabled, :checked и :unchecked доступны)

Псевдо-элементы (:before, :after, :first-line, :first-letter) не поддерживаются, так как они выбирают части текста, а не элементы.

Некоторые псевдо-классы ещё не поддерживаются:

  • *:first-of-type, *:last-of-type, *:nth-of-type, *:nth-last-of-type, *:only-of-type. (Эти работают с именем элемента (например, li:first-of-type) но не с *.

Узнайте больше

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.