DomQuery

其他类别 2025-08-18

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 ('

Hello

'); echo $dom->find('h1')->text(); // output: Hello echo $dom->find('div')->prop('outerHTML'); // output:

Hello

echo $dom->find('div')->html(); // output:

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 ( ' 

Hello

'
); echo $ dom -> find ( ' h1 ' )-> text (); // output: Hello echo $ dom -> find ( ' div ' )-> prop ( ' outerHTML ' ); // output:

Hello

echo $ dom -> find ( ' div ' )-> html (); // output:

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