CssSelector 组件
CssSelector 组件将 CSS 选择器转换为 XPath 表达式。
安装
1
$ composer require symfony/css-selector
注意
如果您在 Symfony 应用程序之外安装此组件,则必须在代码中引入 vendor/autoload.php
文件,以启用 Composer 提供的类自动加载机制。阅读 这篇文章 了解更多详情。
用法
另请参阅
本文介绍了如何在任何 PHP 应用程序中将 CssSelector 功能用作独立组件。阅读 Symfony 功能测试 文章,了解如何在创建 Symfony 测试时使用它。
为何使用 CSS 选择器?
当您解析 HTML 或 XML 文档时,目前为止最强大的方法是 XPath。
XPath 表达式非常灵活,因此几乎总能找到您需要的元素的 XPath 表达式。不幸的是,它们也可能变得非常复杂,学习曲线陡峭。即使是常见的操作(例如查找具有特定类的元素)也可能需要冗长且笨拙的表达式。
许多开发者,尤其是 Web 开发者,更习惯使用 CSS 选择器来查找元素。除了在样式表中使用外,CSS 选择器还在 JavaScript 中与 querySelectorAll()
函数以及 jQuery 等流行的 JavaScript 库一起使用。
CSS 选择器不如 XPath 强大,但更易于编写、阅读和理解。由于它们的功能较弱,几乎所有 CSS 选择器都可以转换为等效的 XPath。然后,此 XPath 表达式可以与使用 XPath 在文档中查找元素的其他函数和类一起使用。
CssSelector 组件
该组件的唯一目标是使用 toXPath() 将 CSS 选择器转换为其 XPath 等效项
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 等工具一起使用,以在文档中查找元素。
提示
Crawler::filter() 方法使用 CssSelector 组件根据 CSS 选择器字符串查找元素。有关更多详细信息,请参阅 DomCrawler 组件。
CssSelector 组件的局限性
并非所有 CSS 选择器都可以转换为 XPath 等效项。
有一些 CSS 选择器仅在 Web 浏览器的上下文中才有意义。
- 链接状态选择器:
: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
(所有这些都适用于元素名称(例如li:first-of-type
),但不适用于*
选择器)。 - 支持:
*:only-of-type
,*:scope
,*:is
和*:where
。
7.1
对 *:is
和 *:where
的支持在 Symfony 7.1 中引入。