amsify42 / php-domfinder
PHP包,用于高效且易于阅读的方式搜索文档对象模型。
Requires
- php: >=7.0.0
- amsify42/php-curl-http: dev-master
Requires (Dev)
- php: >=7.0.0
- amsify42/php-curl-http: dev-master
- phpunit/phpunit: ^7.0
This package is not auto-updated.
Last update: 2024-09-18 14:34:06 UTC
README
PHP包,用于高效且易于阅读的方式搜索文档对象模型。
安装
$ composer require amsify42/php-domfinder
目录
1. 加载源代码
文件
$domFinder = new Amsify42\DOMFinder\DOMFinder('path/to/file.html'); // or $domFinder = new Amsify42\DOMFinder\DOMFinder(); $domFinder->load('path/to/file.html');
HTML
$domFinder = new Amsify42\DOMFinder\DOMFinder('path/to/file.html', 'html'); // or $domFinder = new Amsify42\DOMFinder\DOMFinder(); $domFinder->loadHTML('path/to/file.html');
XML
$domFinder = new Amsify42\DOMFinder\DOMFinder('path/to/file.xml', 'xml'); // or $domFinder = new Amsify42\DOMFinder\DOMFinder(); $domFinder->loadXML('path/to/file.xml');
URL
对于HTML
$domFinder = new Amsify42\DOMFinder\DOMFinder('http://www.site.com/file.html', 'html', true); // or $domFinder = new Amsify42\DOMFinder\DOMFinder(); $domFinder->loadHTML('http://www.site.com/file.html', true);
对于XML
$domFinder = new Amsify42\DOMFinder\DOMFinder('http://www.site.com/file.xml', 'xml', true); // or $domFinder = new Amsify42\DOMFinder\DOMFinder(); $domFinder->loadXML('http://www.site.com/file.xml', true);
使用辅助方法
$domFinder = get_dom_finder('http://www.site.com/file.html', 'html', true);
注意:确保在构造函数/辅助方法中将第三个参数传递为true
,或者在加载方法中将第二个参数传递为true
以从URL加载内容。
2. 重要提示
1. DOMDocument
Amsify42\DOMFinder\DOMFinder
类使用Amsify42\DOMFinder\DOM\Document
,它扩展了PHP预定义类DOMDocument
。您可以使用此实例使用DOMDocument
的所有方法
$domFinder->dom();
示例
$domFinder->dom()->getElementsByTagName('p');
2. DomXPath
Amsify42\DOMFinder\DOMFinder
类使用PHP预定义类DomXPath
进行查询。如果您想使用DomXPath
的所有方法,您可以使用此实例
$domFinder->finder();
示例
$domFinder->finder()->query("/div[@class='body-entry']");
3. DOMElement
查询文档后得到的所有元素结果都将类型为Amsify42\DOMFinder\DOM\Element
,它扩展了PHP预定义类DOMElement
。
$anchors = $domFinder->find('a')->byClass('action-link')->all(); if($anchors->length) { foreach($anchors as $anchor) { var_dump($anchor); // Will be of type Amsify42\DOMFinder\DOM\Element which extends DOMElement } }
您可以使用所有从所有元素项中获取的DOMElement
的方法。示例
foreach($anchors as $anchor) { $anchor->getAttribute('href'); }
最重要的是,当您尝试通过索引获取第一个或特定键元素时,它将返回NULL
或类型为Amsify42\DOMFinder\DOM\Element
的元素。示例
$para = $domFinder->getFirstElement('p'); // or $para = $domFinder->getElement('p', 1); // or $para = $domFinder->findFirst('p'); // or $para = $domFinder->find('p')->first(); // or $para = $domFinder->find('p')->get(1);
3. 元标签
在加载源代码后,您可以使用这些与元标签相关的功能。
$metaTags = $domFinder->metaTags();
获取特定元标签的值
<meta name="title" content="Amsify42">
$title = $domFinder->getMetaValue('name', 'title');
默认情况下,它从元元素中获取content
属性值,要获取其他属性值,请传递第三个参数
<meta name="title" myattr="Amsify42">
$title = $domFinder->getMetaValue('name', 'title', 'myattr');
4. 元素
从DOM获取特定元素
$paras = $domFinder->getElements('p');
获取第一个元素
$para = $domFinder->getFirstElement('p');
通过索引位置获取元素
$para = $domFinder->getElement('p', 1);
5. 元素类
等于
通过类名查找所有元素
$elements = $domFinder->findByClass('section-items')->all();
通过类查找第一个元素
$element = $domFinder->findByClass('section-items')->first(); // or $element = $domFinder->findFirstByClass('section-items');
通过类查找所有div标签元素
$elements = $domFinder->find('div')->byClass('section-items')->all();
通过类查找第一个div标签元素
$element = $domFinder->find('div')->byClass('section-items')->first();
通过键位置获取元素
$element = $domFinder->find('div')->byClass('section-items')->get(1); // This will return 2nd element
类似
查找包含类的所有元素
$elements = $domFinder->findClassLike('section-items')->all();
查找包含类的第一个元素
$element = $domFinder->findClassLike('section-items')->first(); // or $element = $domFinder->findFirstClassLike('section-items');
查找包含类的所有div标签元素
$divs = $domFinder->find('div')->classLike('section-items')->all();
查找包含类的第一个div标签元素
$div = $domFinder->find('div')->classLike('section-items')->first();
通过键位置获取元素
$div = $domFinder->find('div')->classLike('section-items')->get(1); // This will return 2nd element
6. 元素ID
等于
通过ID查找所有元素
$elements = $domFinder->findById('body-entry')->all();
通过ID查找第一个元素
$element = $domFinder->findById('body-entry')->first(); // or $element = $domFinder->findFirstById('body-entry');
通过ID查找所有div标签元素
$divs = $domFinder->find('div')->byId('body-entry')->all();
通过ID查找第一个div标签元素
$div = $domFinder->find('div')->byId('body-entry')->first();
类似
查找包含ID的所有元素
$elements = $domFinder->findIdLike('section-')->all();
查找包含ID的第一个元素
$element = $domFinder->findIdLike('section-')->first(); // or $element = $domFinder->findFirstIdLike('section-');
查找包含ID的所有div标签元素
$divs = $domFinder->find('div')->idLike('section-')->all();
查找包含ID的第一个div标签元素
$div = $domFinder->find('div')->idLike('section-')->first();
通过键位置获取元素
$div = $domFinder->find('div')->idLike('section-')->get(1); // This will return 2nd element
7. 元素属性
等于
通过属性查找所有元素
$elements = $domFinder->findByAttr('data-section', 'paragraph')->all();
通过属性查找第一个元素
$element = $domFinder->findByAttr('data-section', 'paragraph')->first(); // or $element = $domFinder->findFirstByAttr('data-section', 'paragraph');
通过属性查找所有div标签元素
$divs = $domFinder->find('div')->byAttr('data-section', 'paragraph')->all();
通过属性查找第一个div标签元素
$div = $domFinder->find('div')->byAttr('data-section', 'paragraph')->first();
通过键位置获取元素
$div = $domFinder->find('div')->byAttr('data-section', 'paragraph')->get(1); // This will return 2nd element
类似
查找包含属性的所有元素
$elements = $domFinder->findAttrLike('my-att', 'some-')->all();
查找包含属性的第一个元素
$element = $domFinder->findAttrLike('my-att', 'some-')->first(); // or $element = $domFinder->findFirstAttrLike('my-att', 'some-');
查找所有包含属性的div标签元素
$divs = $domFinder->find('div')->attrLike('my-att', 'some-')->all();
查找第一个包含属性的div标签元素
$div = $domFinder->find('div')->attrLike'my-att', 'some-')->first();
通过键位置获取元素
$div = $domFinder->find('div')->attrLike('my-att', 'some-')->get(1); // This will return 2nd element
8. 正则表达式提取
要从HTML中提取特定项,请考虑以下示例HTML
$html = '<div class="section"> <script>var data={"name": "my name", "id":12345};</script> </div>'; $domFinder = new Amsify42\DOMFinder\DOMFinder(); $domFinder->loadHTML($html); $section = $domFinder->findFirstByClass('section'); if($section) { $data = $section->extractByRegex("/data\=(.*?)\;</"); // Here you will get js dictionary data }
要通过正则表达式提取多个实例的数据,请将第二个参数传递为true
$html = '<div class="section"> <some-element class="some-class">{"name": "name one", "id":1}</some-element> <some-element class="some-class">{"name": "name two", "id":2}</some-element> <some-element class="some-class">{"name": "name three", "id":3}</some-element> </div>'; $domFinder = new Amsify42\DOMFinder\DOMFinder(); $domFinder->loadHTML($html); $section = $domFinder->findFirstByClass('section'); if($section) { $data = $section->extractByRegex("/class=\"some-class\">(.*?)\<\//", true); // Here you will get multiple js dictionary data as array }
您也可以传递多个正则表达式数组以进行多级检查和提取
$data = $section->extractByRegex(["/<some-element(.*?)some-element>/", "/class=\"some-class\">(.*?)\<\//"], true);
9. 元素方法
这些是您可以在元素级别使用的函数
<ul class="list-items"> <li>Item one</li> <li>Item two</li> <li>Item three</li> </ul>
$ul = $domFinder->getElement('ul'); // or $ul = $domFinder->findFirst('ul');
要获取元素的内部和外部HTML,您可以使用以下方法
echo $ul->outerHTML();
外部HTML将打印
<ul class="list-items"> <li>Item one</li> <li>Item two</li> <li>Item three</li> </ul>
echo $ul->innerHTML();
内部HTML将打印
<li>Item one</li> <li>Item two</li> <li>Item three</li>
10. 多级查找器
本节旨在演示DOM查找器在多级上的工作方式。
<div class="parent-class"> <div class="child-class"> <ul class="list"> <li class="item">one</li> <li class="item">two</li> <li class="item">three</li> </ul> </div> <div class="child-class"> <ul class="list"> <li class="item">one</li> <li class="item">two</li> <li class="item">three</li> </ul> </div> </div>
简单
$uls = $domFinder->find('div')->byClass('child-class')->find('ul')->all(); // or $uls = $domFinder->find('div')->byClass('child-class')->findAll('ul');
上述查询与DomXPath
相同
$uls = $domFinder->finder()->query("/div[@class='child-class']/ul");
您将获得所有ul
元素
if($uls->length) { foreach($uls as $ul) { var_dump($ul); } }
元素级别
实际上,当您尝试查询时,此方法会在每个元素级别创建DOMFinder
实例。
$div = $domFinder->find('div')->byClass('parent-class')->first(); if($div) { $divs = $div->find('div')->byClass('child-class')->all(); // At this level DOMFinder instance will be created and assigned to this element if($divs->length) { echo $divs->length; } }