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 (\'<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 ( \' <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
遍历节点(结果集):
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 ; $ 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
工厂方法(创建实例替代):
DomQuery ;
DomQuery ::create(\'<a title=\”hello\”></a>\’)->attr(\’title\’) // hello\”>
use Rct567 \\ DomQuery \\ DomQuery ; DomQuery :: create ( \' <a title=\"hello\"></a> \' )-> 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
