rct567/dom-query

DomQuery是一个PHP库,允许轻松进行类似jQuery的DOM遍历和操作

v1.1 2024-01-18 20:32 UTC

README

DomQuery是一个PHP库,它允许您轻松遍历和修改DOM(HTML/XML)。作为一个库,它的目标是提供类似jQuery访问PHP DOMDocument类(https://php.ac.cn/manual/en/book.dom.php)的方式。

安装

使用以下命令安装最新版本

$ composer require rct567/dom-query

基本用法

读取属性和属性

use Rct567\DomQuery\DomQuery;

$dom = new DomQuery('<div><h1 class="title">Hello</h1></div>');

echo $dom->find('h1')->text(); // output: Hello
echo $dom->find('div')->prop('outerHTML'); // output: <div><h1 class="title">Hello</h1></div>
echo $dom->find('div')->html(); // output: <h1 class="title">Hello</h1>
echo $dom->find('div > h1')->class; // output: title
echo $dom->find('div > h1')->attr('class'); // output: title
echo $dom->find('div > h1')->prop('tagName'); // output: h1
echo $dom->find('div')->children('h1')->prop('tagName'); // output: h1
echo (string) $dom->find('div > h1'); // output: <h1 class="title">Hello</h1>
echo count($dom->find('div, h1')); // output: 2

遍历节点(结果集)

use Rct567\DomQuery\DomQuery;

$dom = new DomQuery('<a>1</a> <a>2</a> <a>3</a>');
$links = $dom->children('a');

foreach($links as $elm) {
    echo $elm->text(); // output 123
}

echo $links[0]->text(); // output 1
echo $links->last()->text(); // output 3
echo $links->first()->next()->text(); // output 2
echo $links->last()->prev()->text(); // output 2
echo $links->get(0)->textContent; // output 1
echo $links->get(-1)->textContent; // output 3

工厂方法(创建实例的替代方法)

use Rct567\DomQuery\DomQuery;

DomQuery::create('<a title="hello"></a>')->attr('title') // hello

可用的jQuery方法

遍历 > 树遍历

  • .find(选择器)
  • .children([选择器])
  • .parent([选择器])
  • .closest([选择器])
  • .next([选择器])
  • .prev([选择器])
  • .nextAll([选择器])
  • .prevAll([选择器])
  • .nextUntil([选择器])
  • .prevUntil([选择器])
  • .siblings([选择器])

遍历 > 其他遍历

  • .contents() 获取包括文本节点在内的子元素
  • .add(选择器, [上下文]) 新的结果集,包含匹配选择器的元素
  • .addBack()

遍历 > 过滤

  • .is(选择器)
  • .filter(选择器) 减少到匹配选择器的那些元素
  • .not(选择器) 从匹配元素集中移除元素
  • .has(选择器) 减少到具有匹配选择器的后代元素
  • .first([选择器])
  • .last([选择器])
  • .slice([偏移量] [, 长度]) 类似于php中的array_slice,而不是js/jquery
  • .eq(索引)
  • .map(可调用elm,i)

* [选择器] 可以是CSS选择器或DomQuery|DOMNodeList|DOMNode的实例

操作 > DOM插入和删除

  • .text([文本])
  • .html([html字符串])
  • .append([内容],...)
  • .prepend([内容],...)
  • .after([内容],...)
  • .before([内容],...)
  • .appendTo([目标])
  • .prependTo([目标])
  • .replaceWith([内容])
  • .wrap([内容])
  • .wrapAll([内容])
  • .wrapInner([内容])
  • .remove([选择器])

* [内容] 可以是HTML或DomQuery|DOMNodeList|DOMNode的实例

属性 | 操作

  • .attr(名称[,值])
  • .prop(名称[,值])
  • .css(名称[,值])
  • .removeAttr(名称)
  • .addClass(名称)
  • .hasClass(名称)
  • .toggleClass (名称)
  • .removeClass([名称])

* addClass、removeClass、toggleClass 和 removeAttr 还可以接受一个数组或空格分隔的 名称

其他 > DOM元素方法 | 遍历 | 存储

  • .get(索引)
  • .each (可调用elm,i)
  • .data (键[,值])
  • .removeData ([名称])
  • .index ([选择器])
  • .toArray()
  • .clone()

支持的选择器

  • .class
  • #foo
  • 父 > 子
  • foo, bar 多个选择器
  • prev + next 匹配“next”的元素,且紧接在“prev”兄弟元素之后
  • prev ~ siblings 匹配“siblings”的元素,且在“prev”之前
  • * 全部选择器
  • [name="foo"] 属性值等于 foo
  • [name*="foo"] 属性值包含 foo
  • [name~="foo"] 属性值包含单词 foo
  • [name^="foo"] 属性值以 foo 开头
  • [name$="foo"] 属性值以 foo 结尾
  • [name|="foo"] 属性值等于 foo,或者以 foo 开头后跟一个连字符 (-)

伪选择器

  • :empty
  • :even
  • :odd
  • :first-child
  • :last-child
  • :only-child
  • :nth-child(n)
  • :parent 至少有一个子节点的元素
  • :first
  • :last
  • :header 选择 h1, h2, h3 等
  • :not(foo) 不匹配选择器 foo 的元素
  • :has(foo) 包含至少一个匹配 foo 选择器的元素的元素
  • :contains(foo) 包含文本 foo 的元素
  • :root 是文档根的元素

其他(非 jQuery)方法

  • findOrFail( selector ) 在当前匹配元素集中查找每个元素的子代,或抛出异常
  • loadContent(content, encoding='UTF-8') 加载 html/xml 内容
  • xpath(xpath_query) 使用 xpath 在当前匹配元素集中查找子代
  • getOuterHtml() 获取描述所有元素的最终 html(等同于 (string) $dom,或 $elm->prop('outerHTML')

XML 支持

  • 如果找到 XML 声明(属性 xml_mode 将设置为 true),XML 内容将自动加载为 'XML'
  • 这反过来也会使得保存(渲染)以 'XML' 形式发生。您可以将属性 xml_mode 设置为 false 以防止这种情况。
  • 要防止具有 XML 声明的内容以 'XML' 的形式加载,您可以设置属性 xml_mode 为 false,然后使用 loadContent($content) 方法。
  • 命名空间将自动注册(无需手动操作 操作

在选择器中转义元字符以查找具有命名空间的元素

$dom->find('namespace\\:h1')->text();

关于

要求

  • 与 PHP 7.2 或更高版本兼容(对于旧版本的 PHP,请尝试 v0.8)
  • 需要 libxml PHP 扩展(默认启用)

灵感/致谢