brjpeters/php-html-parser

该软件包已被废弃,不再维护。未建议替代软件包。

HTML DOM 解析器。它允许您操作 HTML。使用选择器在 HTML 页面上查找标签,就像 jQuery 一样。

1.6.4 2014-08-04 18:42 UTC

This package is not auto-updated.

Last update: 2018-01-09 07:38:54 UTC


README

版本 1.6.4

PHPHtmlParser 是一个简单、灵活的 html 解析器,允许您使用任何 CSS 选择器选择标签,就像 jQuery 一样。目标是帮助开发工具,这些工具需要快速、简单的方式抓取 HTML,无论其是否有效!该项目最初由 sunra/php-simple-html-dom-parser 支持,但支持似乎已停止,因此该项目是我对其之前工作的改编。

安装

您可以在 packagist 上找到此软件包,并建议使用 composer 加载。我们支持 php 5.3、5.4、5.5 和 hhvm 2.3。

使用方法

您可以在测试目录中找到许多如何使用 dom 解析器及其任何部分(您最有可能永远都不会接触)的示例。这些测试使用 PHPUnit 进行,非常小,每个只有几行,是一个很好的起点。鉴于这一点,我仍将展示一些如何使用此软件包的示例。以下是一个非常简单的使用示例。

use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->load('<div class="all"><p>Hey bro, <a href="google.com">click here</a><br /> :)</p></div>');
$a = $dom->find('a')[0];
echo $a->text; // "click here"

上述代码将输出 "点击这里"。简单吗?从 dome 获取相同结果的方式有很多,例如 $dom->getElementsbyTag('a')[0]$dom->find('a', 0),这些都可以在测试或代码本身中找到。

加载文件

您还可以无缝地将文件加载到 dom 中,而不是字符串,这更加方便,也是我预期大多数开发者将加载 HTML 的方式。以下示例取自我们的测试,并使用该目录中找到的 "big.html" 文件。

use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadFromFile('tests/big.html');
$contents = $dom->find('.content-border');
echo count($contents); // 10

foreach ($contents as $content)
{
	// get the class attr
	$class = $content->getAttribute('class');
	
	// do something with the html
	$html = $content->innerHtml;

	// or refine the find some more
	$child   = $content->firstChild();
	$sibling = $child->nextSibling();
}

此示例从 big.html 加载 HTML,这是一个在网络上找到的实时页面,并获取所有内容-border 类以进行处理。它还展示了您可以使用节点做一些事情,但这不是节点具有的所有可用方法的完整列表。

作为替代,您始终可以使用 load() 方法来加载文件。它将尝试使用 file_exists 查找文件,如果成功,将为您调用 loadFromFile()。同样适用于 URL 和 loadFromUrl() 方法。

加载 URL

加载 URL 与从文件加载 HTML 的方式非常相似。

use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadFromUrl('http://google.com');
$html = $dom->outerHtml;

// or
$dom->load('http://google.com');
$html = $dom->outerHtml; // same result as the first example

loadFromUrl 方法的特别之处在于 PHPHtmlParser\CurlInterface 参数,这是一个可选的第二个参数。默认情况下,我们使用 PHPHtmlParser\Curl 类获取 URL 的内容。另一方面,您也可以注入您自己的 CurlInterface 实现,我们将尝试使用您想要的任何工具/设置来加载 URL,这取决于您。

use PHPHtmlParser\Dom;
use App\Services\Connector;

$dom = new Dom;
$dom->loadFromUrl('http://google.com', new Connector);
$html = $dom->outerHtml;

只要连接器对象正确实现了 PHPHtmlParser\CurlInterface 接口,它就会使用该对象来获取 URL 的内容,而不是默认的 PHPHtmlParser\Curl 类。

选项

您还可以设置解析选项,这将影响解析引擎的行为。您可以使用Dom对象中的setOptions方法设置全局选项数组,或者通过将其添加到load方法中作为额外的(可选)参数来设置特定实例的选项。

use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->setOptions([
	'strict' => true, // Set a global option to enable strict html parsing.
]);

$dom->load('http://google.com', [
	'whitespaceTextNode' => false, // Only applies to this load.
]);

$dom->load('http://gmail.com'); // will not have whitespaceTextNode set to false.

目前我们支持两个选项:严格和空白文本节点。默认情况下,严格为false,如果它发现HTML不是严格兼容的(所有标签都必须有闭合标签,没有值的属性等),则将抛出StrickException异常。

空白文本节点选项默认为true,告诉解析器即使节点的内容为空(只有空白),也要保存文本节点。将其设置为false将忽略文档中找到的所有仅包含空白的文本节点。

静态外观

您还可以为Dom对象安装静态外观。

PHPHtmlParser\StaticDom::mount();

Dom::load('tests/big.hmtl');
$objects = Dom::find('.content-border');

上面的PHP代码块执行了与第一个示例相同的查找和加载操作,但它使用的是静态外观,该外观支持在Dom对象中找到的所有公共方法。