跳到内容

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

您可以将此表达式与 DOMXPathSimpleXMLElement 等工具一起使用,以在文档中查找元素。

提示

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 中引入。

本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可协议获得许可。
目录
    版本