dgoring/dom-query

此包已废弃,不再维护。作者建议使用 rct567/dom-query 包。

DomQuery 是一个 PHP 库,允许轻松地进行类似 jQuery 的 DOM 遍历和操作。

1.0.0 2022-11-02 13:28 UTC

This package is auto-updated.

Last update: 2024-03-09 07:10:38 UTC


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 扩展(默认启用)

致谢