amsify42/php-domfinder

PHP包,用于高效且易于阅读的方式搜索文档对象模型。

1.0 2020-03-22 14:46 UTC

This package is not auto-updated.

Last update: 2024-09-18 14:34:06 UTC


README

PHP包,用于高效且易于阅读的方式搜索文档对象模型。

安装

$ composer require amsify42/php-domfinder

目录

  1. 加载源代码
  2. 重要提示
  3. 元标签
  4. 元素
  5. 元素类
  6. 元素ID
  7. 元素属性
  8. 正则表达式提取
  9. 元素方法
  10. 多级查找器

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;
	}
}