DomQuery
DomQuery是一个PHP库,可让您轻松地穿越并修改DOM(HTML/XML)。作为图书馆,它旨在提供对PHP Domdocument类(http://ph**p*.net/manual/manual/en/en/book.dom.php)的“ jQuery”。
安装
安装最新版本
$ composer require rct567/dom-query基本用法
读取属性和属性:
DomQuery ;
$dom = new DomQuery ('');
echo $dom->find('h1')->text(); // output: Hello
echo $dom->find('div')->prop('outerHTML'); // output:
echo $dom->find('div')->html(); // output:
Hello
Hello
Hello
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:Hello
echo count($dom->find('div, h1')); // output: 2">use Rct567 DomQuery DomQuery ; $ dom = new DomQuery ( '' ); echo $ dom -> find ( ' h1 ' )-> text (); // output: Hello echo $ dom -> find ( ' div ' )-> prop ( ' outerHTML ' ); // output:Hello
echo $ dom -> find ( ' div ' )-> html (); // output:Hello
Hello
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:Hello
echo count ( $ dom -> find ( ' div, h1 ' )); // output: 2
遍历节点(结果集):
DomQuery ;
$dom = new DomQuery ('1 2 3');
$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 ; $ dom = new DomQuery ( ' 1 2 3 ' ); $ 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
工厂方法(创建实例替代):
DomQuery ;
DomQuery ::create('')->attr('title') // hello">
use Rct567 DomQuery DomQuery ; DomQuery :: create ( ' ' )-> attr ( ' title ' ) // hello
可用的方法
遍历>树遍历
.find( selector )-
.children( [selector] ) -
.parent( [selector] ) -
.closest( [selector] ) -
.next( [selector] ) -
.prev( [selector] ) -
.nextAll( [selector] ) -
.prevAll( [selector] ) -
.nextUntil( [selector] ) -
.prevUntil( [selector] ) -
.siblings( [selector] )
遍历>其他遍历
-
.contents()让孩子在内 -
.add( selector, [context] )新结果,并带有匹配选择器的添加元素 -
.addBack()
遍历>过滤
.is( selector )-
.filter ( selector )将匹配的效果降低到选择器 -
.not( selector )从匹配元素集中删除元素 .has( selector )-
.first( [selector] ) -
.last( [selector] ) -
.slice( [offset] [, length]) -
.eq( index ) -
.map( callable(elm,i) )
* [选择器]可以是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也接受阵列或空格分离名称
其他> DOM元素方法|遍历|贮存
.get( index )-
.each ( callable(elm,i) ) -
.data ( key [, val] ) -
.removeData ( [name] ) -
.index ( [selector] ) -
.toArray() -
.clone()
支持的选择器
.class-
#foo -
parent > child -
foo, bar多个选择器 -
prev + next元素匹配紧接兄弟姐妹的“下一个” - 匹配的“兄弟姐妹”的
prev ~ 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)元素 -
:has(foo)元素 -
:contains(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内容“ AS XML”(XML”) - 反过来,这也将使节省(渲染)发生“为XML”。您可以将属性
xml_mode设置为false,以防止这种情况。 - 为了防止使用XML声明加载“ AS XML”的内容,您可以将属性
xml_mode设置为false,然后使用loadContent($content)方法。 - 名称空间会自动注册(无需手动执行)
在选择器中逃脱元字符以找到具有名称空间的元素:
$ dom -> find ( ' namespace \ :h1 ' )-> text ();关于
要求
- 使用PHP 7.2或以上(对于较旧的PHP版本,尝试V0.8)
- 需要LIBXML PHP扩展(默认启用)
灵感/致谢
- https://gi*t*hub.*com/wasinger/htmlpagedom
- https://gi*th*ub.c*om/symfony/dom-crawler
- https://g*ithub**.com/artack/domquery
- https://git*hub.*co*m/zendframework/zend-dom
- http://simplehtmldom.so*u**rceforge.net
下载源码
通过命令行克隆项目:
git clone https://github.com/Rct567/DomQuery.git