DomQuery是一个PHP库,使您可以轻松地遍历和修改DOM(HTML / XML)。 作为库,它的目标是提供对 PHP DOMDocument 类 的 "仿jQuery" 的访问方式
安装最新版本
composer require edwinhuish/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$dom = new DomQuery('<a>1</a> <a>2</a> <a>3</a>');
$links = $dom->children('a');
// foreach 遍历
$texts = [];
foreach($links as $key => $dq) { // $dq 是 DomQuery 对象
$texts[] = $dq->text();
}
print_r($texts); // array('1','2','3')
// map 遍历
$result = $links->map(function(DomQuery $dq, int $idx){
return $dq->text();
});
// map 函数返回 Collection 对象
print_r($result->toArray()); // array('1','2','3')
// each 遍历, 与 Collection 的 each 函数类似, 返回 false 则中断循环。
$links->each(function(DomQuery $dq, int $idx){
if($idx === 1){
return false;
}
$dq->text('changed');
});
print_r($links->texts()); // array('changed', '2', '3')
echo $links->text(); // output 1,仅返回第一个子节点的text,如需要返回多个,请使用 texts() 或者 foreach, each, map 函数
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 3DomQuery::create('<a title="hello"></a>')->attr('title') // hello.find( selector ).children( [selector] ).parent( [selector] ).closest( [selector] ).next( [selector] ).prev( [selector] ).nextAll( [selector] ).prevAll( [selector] ).siblings( [selector] )
.contents()获取所有子节点,包含空格或者其他文本亦视为子节点.add( selector, [context] )如果context为空,则从现有document中查找对应selector加入集合,否则从context中查找对应selector加入集合
.is( selector ).filter ( selector )筛选符合selector的节点, selector 可以是 callable.not( selector )将selector对应的节点从集合中去除.has( selector )子节点内含有对应selector的节点集合.first( [selector] ).last( [selector] ).slice( [offset] [, length])类似 PHP 的 array_slice, 非 js/jquery.eq( index ).map( callable(elm,i) )
* [selector] 可以是 css selector 或者 DomQuery|DOMNodeList|DOMNode 的对象实例
.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] ).unwrap().first().last().gt( int $index ).lt( int $index )
* [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
.get( index ).each ( callable(elm,i) ).data ( key [, val] ).removeData ( [name] ).index ( [selector] ).toArray().clone()
.class#fooparent > childfoo, bar多个 selectorsprev + next例如:div + p选择紧接在<div>元素之后的所有<p>元素。prev ~ siblings例如:p ~ ul选择前面有<p>元素的每个<ul>元素。*所有节点[name="foo"]属性名称为 foo[name*="foo"]例如:a[src*="abc"]选择其src属性中包含abc子串的每个<a>元素。[name~="foo"]例如:[title~=flower]选择title属性包含单词 "flower" 的所有元素。[name^="foo"]例如:a[src^="https"]选择其src属性值以 "https" 开头的每个<a>元素。[name$="foo"]例如:a[src$=".pdf"]选择其src属性以 ".pdf" 结尾的所有<a>元素。[name|="foo"]例如:[lang|=en]选择 lang 属性值以 "en" 开头的所有元素。
:empty:even:odd:first-child:last-child:only-child:parent必须至少有一个子元素:first:last:header选择 h1, h2, h3 等.:not(foo)选择非 selector foo 的元素集合:has(foo)至少有一个子节点匹配 foo selector 的节点:contains(foo)含有 foo text 的节点:root文档的根元素。:nth-child(n):nth-child(even):nth-child(odd):nth-child(3n+8):nth-child(2n+1):nth-child(n+4)等同于:gt(2):nth-child(-n+4)等同于:lt(4):nth-child(3):nth-child(-2):nth-child(4n):eq(0):eq(-1):lt(3):gt(2)
findOrFail( selector )查找选择元素,如果找不到则抛出异常loadContent(content, encoding='UTF-8')加载 html/xml 内容xpath(xpath_query)使用xpath查找当前匹配元素集中每个元素的后代getOuterHtml()得到集合所有元素的html (和(string) $dom,$elm->prop('outerHTML')一致)
- 如果找到 XML 声明,XML 内容会自动加载为 XML (属性
xml_mode将会设置为true) - 同时会使保存(渲染)如 XML。您可以将
xml_mode设为false来避免这个状况。 - 为防止插入
XML声明的内容,您可以将xml_mode设为false,再用loadContent($content)函数进行加载。 - Namespaces 会自动注册。 (无须手动注册)
在选择器中转义元字符以查找具有名称空间的元素:
$dom->find('namespace\\:h1')->text();- PHP 7.0 或者以上
- libxml 扩展 (默认开启)