rct567 / dom-query
DomQuery是一个PHP库,允许轻松进行类似jQuery的DOM遍历和操作
v1.1
2024-01-18 20:32 UTC
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpunit/php-code-coverage: ^7.0||^9.0
- phpunit/phpunit: ^8.5||^9.3
- squizlabs/php_codesniffer: ^3.7
This package is not auto-updated.
Last update: 2024-09-14 01:57:48 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 扩展(默认启用)