dgoring / dom-query
1.0.0
2022-11-02 13:28 UTC
Requires (Dev)
- phpstan/phpstan: ^0.12
- phpunit/php-code-coverage: ^5.3|^9.0
- phpunit/phpunit: ^6.5|^9.3.3
- squizlabs/php_codesniffer: ^3.1
README
DomQuery 是一个 PHP 库,允许您轻松地遍历和修改 DOM(HTML/XML)。作为一个库,它旨在提供类似 jQuery 的对 PHP DOMDocument 类(https://php.ac.cn/manual/en/book.dom.php)的访问。
主要由 Rct567 构建,但似乎已经放弃了它
安装
使用以下命令安装最新版本:
$ composer require dgoring/dom-query
基本用法
读取属性和属性
use Dgoring\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 Dgoring\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 Dgoring\DomQuery\DomQuery; DomQuery::create('<a title="hello"></a>')->attr('title') // hello
可用的 jQuery 方法
遍历 > 树遍历
.find( selector )
.children( [selector] )
.parent( [selector] )
.closest( [selector] )
.next( [selector] )
.prev( [selector] )
.nextAll( [selector] )
.prevAll( [selector] )
.siblings( [selector] )
遍历 > 其他遍历
.contents()
获取包括文本节点在内的子元素.add( selector, [context] )
新结果包含匹配选择器的元素
遍历 > 过滤
.is( selector )
.filter ( selector )
筛选出匹配选择器的元素.not( selector )
从匹配的元素集中删除元素.has( selector )
筛选出有匹配选择器的子元素的元素.first( [selector] )
.last( [selector] )
.slice( [offset] [, length])
类似于 php 中的 array_slice,而不是 js/jquery.eq( index )
.map( callable(elm,i) )
* [selector] 可以是 CSS 选择器或 DomQuery|DOMNodeList|DOMNode 的实例
操作 > DOM 插入和删除
.text( [text] )
.html( [html_string] )
.append( [content],... )
.prepend( [content],... )
.after( [content],... )
.before( [content],... )
.appendTo( [target] )
.prependTo( [target] )
.replaceWith( [content] )
.wrap( [content] )
.wrapAll( [content] )
.wrapInner( [content] )
.remove( [selector] )
* [content] 可以是 HTML 或 DomQuery|DOMNodeList|DOMNode 的实例
属性 | 操作
.attr( name [, val] )
.prop( name [, val] )
.css( name [, val] )
.removeAttr( name )
.addClass( name )
.hasClass( name )
.toggleClass ( name )
.removeClass( [name] )
* addClass、removeClass、toggleClass 和 removeAttr 也接受数组或空格分隔的 names
其他 > DOM 元素方法 | 遍历 | 存储
.get( index )
.each ( callable(elm,i) )
.data ( key [, val] )
.removeData ( [name] )
.index ( [selector] )
.toArray()
.clone()
支持的选择器
.class
#foo
parent > child
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 内容将自动加载为 'XML'(属性
xml_mode
将设置为 true) - 这反过来也会使得保存(渲染)发生为 'XML'。您可以将属性
xml_mode
设置为 false 以阻止此操作。 - 要防止带有 XML 声明的内容加载为 'XML',可以将属性
xml_mode
设置为 false,然后使用loadContent($content)
方法。 - 命名空间会自动注册(无需手动完成)
在选择器中转义元字符以查找具有命名空间的元素
$dom->find('namespace\\:h1')->text();
关于
要求
- 与 PHP 7.0 或更高版本兼容
- 需要 libxml PHP 扩展(默认启用)