berlioz/html-selector

Berlioz HTML Selector 是一个用于在 HTML 文件(转换为 SimpleXMLElement 对象)上执行查询的 PHP 库,类似于 jQuery 在 DOM 上的操作。

v2.0.4 2023-01-04 08:52 UTC

This package is auto-updated.

Last update: 2024-09-04 12:22:14 UTC


README

Latest Version Software license Build Status Quality Grade Total Downloads

Berlioz HTML Selector 是一个用于使用 CSS 选择器在 HTML 文件上执行查询的 PHP 库,类似于在 DOM 上使用 jQuery

安装

Composer

您可以使用 Composer 安装 Berlioz HTML Selector,这是推荐的安装方法。

$ composer require berlioz/html-selector

依赖项

  • PHP ^8.0
  • PHP 库
    • dom
    • libxml
    • mbstring
    • simplexml

用法

加载 HTML

您可以使用静态函数 HtmlSelector::query() 轻松加载 HTML 字符串或文件。对于文件,请使用方法的第二个参数 contentsIsFile

$htmlSelector = new \Berlioz\HtmlSelector\HtmlSelector();

$query = $htmlSelector->query('<html><body>...</body></html>');
$query = $htmlSelector->query('path-of-my-file/file.html', contentsIsFile: true);
$query = $htmlSelector->query(new SimpleXMLElement(/*...*/));

ResponseInterface 加载

HtmlSelector::queryFromResponse() 允许从响应体中加载 HTML。

$htmlSelector = new \Berlioz\HtmlSelector\HtmlSelector();

/** @var \Psr\Http\Message\ResponseInterface $response */
$query = $htmlSelector->queryFromResponse($response);

执行查询

使用选择器查询 HTML 字符串非常简单,类似于 jQuery

/** @var \Berlioz\HtmlSelector\Query\Query $query */
$query = $query->find('body > .wrapper h2');
$query = $query->filter(':first');

选择器

CSS 简单选择器

  • type:选择具有其类型的元素。
  • #id:选择具有其 ID 的元素。
  • .class:选择具有其类的元素。
  • 属性选择。
    • [attribute]:具有 'attribute' 属性。
    • [attribute=foo]:属性值等于 'foo'。
    • [attribute^=foo]:属性值以 'foo' 开头。
    • [attribute$=foo]:属性值以 'foo' 结尾。
    • [attribute=foo]*:属性值包含 'foo'。
    • [attribute!=foo]:属性值不同于 'foo'。
    • [attribute~=foo]:属性值包含单词 'foo'。
    • [attribute|=foo]:属性值包含前缀 'foo'。

CSS 父代、子代、兄弟选择器

  • selector selectorselector >> selector:所有后代选择器。
  • selector > selector:直接子代选择器(仅子元素)。
  • selector ~ selector:兄弟选择器。
  • selector, selector:多选择器。

CSS 伪类

  • :any(selector, selector):仅选择给定参数中的元素。
  • :any-link:仅选择具有 [href] 属性的 <a><area><link> 元素。
  • :blank:仅选择没有子元素且没有文本(除空格外)的元素。
  • :checked:仅选择具有 [checked] 属性的元素。
  • :dir:仅选择具有给定方向文本的元素(默认:ltr)。
  • :disabled:仅选择具有 [disabled] 属性的 <button><input><optgroup><select><textarea> 元素。
  • :empty:仅选择没有子元素的元素。
  • :enabled:仅选择没有 [disabled] 属性的 <button><input><optgroup><option><select><textarea><menuitem><fieldset> 元素。
  • :first:仅选择完整选择结果中的第一个结果。
  • :first-child:仅选择其父元素中的第一个子元素。
  • :first-of-type:仅选择其父元素中的第一个类型。
  • :has(selector, selector):仅选择具有有效子选择器的元素。
  • :lang(x): 仅具有属性 [lang] 且以给定值开头或等于给定值的元素。
  • :last-child: 仅指父母中的最后一个子元素。
  • :last-of-type: 仅指父母中的最后一个指定类型的子元素。
  • :not(selector, selector): 过滤 'not'。
  • :nth-child(): 选择器结果中的第 n 个元素。
  • :nth-last-child(): 选择器结果中的第 n 个元素,从列表末尾开始。
  • :nth-of-type(): 选择器结果中第 n 个指定类型的元素。
  • :nth-last-of-type(): 选择器结果中第 n 个指定类型的元素,从列表末尾开始。
  • :only-child: 仅指父母中唯一的子元素。
  • :only-of-type: 仅指父母中唯一类型的子元素。
  • :optional(): 仅指没有 [required] 属性的输入元素。
  • :read-only(): 仅指用户无法编辑的元素。
  • :read-write(): 仅指具有可编辑属性的元素。
  • :required(): 仅指具有 [required] 属性的元素。
  • :root(): 获取根元素。

来自 jQuery 库的额外 CSS 伪类(不在 CSS 规范中)

  • :button: 仅指没有属性值 [type=submit]<input type="button"><button> 元素。
  • :checkbox: 仅指具有属性 [type=checkbox] 的元素。
  • :contains(x): 仅指包含给定文本的元素。
  • :eq(x): 仅指给定索引的结果(索引从 0 开始)。
  • :even: 仅指选择中的偶数结果。
  • :file: 仅指具有属性 [type=file] 的元素。
  • :gt(x): 仅指索引大于给定索引的结果(索引从 0 开始)。
  • :gte: 仅指索引大于或等于给定索引的结果(索引从 0 开始)。
  • :header: 仅指标题元素,如 <h1><h2>...
  • :image: 仅指具有属性 [type=image] 的元素。
  • :input: 仅指类型为 <input><textarea><select><button> 的元素。
  • :last: 仅指完整选择中的最后一个结果。
  • :lt: 仅指索引小于给定索引的结果(索引从 0 开始)。
  • :lte: 仅指索引小于或等于给定索引的结果(索引从 0 开始)。
  • :odd: 仅指选择中的奇数结果。
  • :parent: 仅指有一个或多个子元素的元素。
  • :password: 仅指具有属性 [type=password] 的元素。
  • :radio: 仅指具有属性 [type=radio] 的元素。
  • :reset: 仅指具有属性 [type=reset] 的元素。
  • :selected: 仅指具有属性 [selected] 的类型为 <option> 的元素。
  • :submit: 仅指类型为 <button><input> 且具有属性 [type=submit] 的元素。
  • :text: 仅指类型为 <input> 且具有属性 [type=text] 或没有 [type] 属性的元素。

额外的 CSS 伪类(不在 CSS 规范中)

  • :count(x): 仅指在父元素中是第 x 个子元素的元素,用于 :has(selector) 伪类。

选择器的完整示例

select > option:selected
div#myId.class1.class2[name1=value1][name2=value2]:even:first

函数

默认函数

某些默认函数在 Query 对象中可用,以与结果交互。这些函数应该与 jQuery 中的对应函数具有相同的结果。

  • attr(name): 获取属性值
  • attr(name, value): 设置属性值
  • children(): 获取结果中元素的孩子。
  • count(): 计算查询结果中的元素数量。
  • data(nameOfData): 获取数据值(名称采用驼峰式语法,不带 'data-' 前缀)。
  • filter(selector): 过滤结果中的元素。
  • find(selector): 在结果中的元素中查找选择器。
  • get(i): 获取结果中的 DOM 元素。
  • hasClass(class_name): 确定结果中的元素是否至少有一个具有给定的类。
  • html(): 获取结果中第一个元素的HTML。
  • index(selector): 获取给定选择器在结果元素中的索引。
  • is(selector): 判断选择器是否在结果中至少匹配一个元素。
  • isset(i): 返回布尔值,表示结果中是否存在元素键。
  • next(selector): 获取结果中每个元素之后的下一个元素。
  • nextAll(selector): 获取结果中每个元素之后的所有后续元素。
  • not(selector): 过滤结果中的元素。
  • parent(): 获取当前选择结果的直接父元素。
  • parents(selector): 获取当前选择结果的所有父元素。
  • prev(selector): 获取结果中每个元素之前的上一个元素。
  • prevAll(selector): 获取结果中每个元素之前的所有前一个元素。
  • prop(name): 获取属性布尔值,例如用于disabled属性。
  • prop(name, value): 设置属性布尔值,例如用于disabled属性。
  • serialize(): 序列化表单的输入值。返回一个字符串。
  • serializeArray(): 序列化表单的输入值。返回一个数组。
  • text(): 获取每个元素的文本并连接。
  • val(): 获取表单元素的值。