要求 | 最低限度 | 推荐 |
---|---|---|
PHP版本 | 5.6.0 | 最新稳定版本 |
PHP扩展 | iconv | iconv,mbstring |
php.ini设置 | --- | allow_url_fopen = 1 ** |
** 这使得使用URL从URL加载文件成为可能file_get_html
快速开始
下面的示例代码演示了 PHP Simple HTML DOM Parser 的基本功能。
从 HTML 文档中读取纯文本
echo file_get_html('https://www.google.com/')->plaintext;
将指定的 HTML文档加载到内存中,对其进行解析并返回纯文本。注意file_get_html
支持本地文件和远程文件!
从 HTML 字符串中读取纯文本
echo str_get_html('<ul><li>Hello, World!</li></ul>')->plaintext;
解析提供的 HTML字符串并返回纯文本。请注意,解析器处理部分文档以及完整文档。
从 HTML 文档中读取特定元素
$html = file_get_html('https://www.google.com/'); foreach($html->find('img') as $element) echo $element->src . '<br>'; foreach($html->find('a') as $element) echo $element->href . '<br>';
将指定的文档加载到内存中并返回图像源列表以及锚链接。请注意,find
支持CSS选择器以在 DOM 中查找元素。
修改 HTML 文档
$doc = '<div id="hello">Hello, </div><div id="world">World!</div>'; $html = str_get_html($doc); $html->find('div', 1)->class = 'bar'; $html->find('div[id=hello]', 0)->innertext = 'foo'; echo $html; // <div id="hello">foo</div><div id="world" class="bar">World!</div>
解析提供的HTML字符串并在返回更新的HTML字符串之前替换DOM中的元素。在本例中,第二个div
元素的类设置为bar
,第一个div
元素的内部文本设置为foo
。
请注意,find
支持第二个参数从匹配数组中返回单个元素。
请注意,可以通过魔术方法直接访问属性(->class
在->innertext
上面的示例中)。
从 Slashdot 收集信息
$html = file_get_html('https://slashdot.org/'); $articles = $html->find('article[data-fhtype="story"]'); foreach($articles as $article) { $item['title'] = $article->find('.story-title', 0)->plaintext; $item['intro'] = $article->find('.p', 0)->plaintext; $item['details'] = $article->find('.details', 0)->plaintext; $items[] = $item; } print_r($items);
从Slashdot收集信息以进行进一步处理。
请注意,CSS 选择器和魔术方法的组合使解析 HTML 文档的过程成为一项易于理解的简单任务。
创建 HTML DOM 对象
面向过程
// Create a DOM object from a string $html = str_get_html('<html><body>Hello!</body></html>'); // Create a DOM object from a URL $html = file_get_html('http://www.google.com/'); // Create a DOM object from a HTML file $html = file_get_html('test.htm');
面向对象
// Create a DOM object $html = new simple_html_dom(); // Load HTML from a string $html->load('<html><body>Hello!</body></html>'); // Load HTML from a URL $html->load_file('http://www.google.com/'); // Load HTML from a HTML file $html->load_file('test.htm');
查找 HTML 元素
按标签名称查找元素
// Find all anchors, returns a array of element objects $ret = $html->find('a'); // Find all anchors and images, returns an array of element objects $ret = $html->find('a, img'); // Find (N)th anchor, returns element object or null if not found (zero based) $ret = $html->find('a', 0); // Find last anchor, returns element object or null if not found (zero based) $ret = $html->find('a', -1);
按类名或 id 查找元素
// Find all element which id=foo $ret = $html->find('#foo'); // Find all element which class=foo $ret = $html->find('.foo');
按属性查找元素
// Find all <div> with the id attribute $ret = $html->find('div[id]'); // Find all <div> which attribute id=foo $ret = $html->find('div[id=foo]'); // Find all anchors and images with the "title" attribute $ret = $html->find('a[title], img[title]'); // Find all element has attribute id $ret = $html->find('*[id]');
属性过滤器
在属性选择器中支持这些运算符:
筛选 | 描述 |
---|---|
[attribute] |
匹配具有 指定属性的元素。 |
[!attribute] |
匹配没有 指定属性的元素。 |
[attribute=value] |
匹配具有 特定值 的指定属性的元素。 |
[attribute!=value] |
将不具有 指定属性的元素与特定值匹配。 |
[attribute^=value] |
匹配具有指定属性并以特定值 开头的元素 。 |
[attribute$=value] |
匹配具有指定属性并以特定值 结尾的元素 。 |
[attribute*=value] |
匹配具有指定属性且 包含 特定值的元素。 |
查找子体
// Find all <li> in <ul> $es = $html->find('ul li'); // Find Nested <div> tags $es = $html->find('div div div'); // Find all <td> in <table> which class=hello $es = $html->find('table.hello td'); // Find all td tags with attribite align=center in table tags $es = $html->find('table td[align=center]');
查找嵌套元素
// Find all <li> in <ul> foreach($html->find('ul') as $ul) { foreach($ul->find('li') as $li) { // do something... } } // Find first <li> in first <ul> $e = $html->find('ul', 0)->find('li', 0);
查找文本块和评论
// Find all text blocks $es = $html->find('text'); // Find all comment (<!--...-->) blocks $es = $html->find('comment');
访问 HTML 元素属性
获取、设置和删除属性
// Get a attribute ( If the attribute is non-value attribute (eg. checked, selected...), it will returns true or false) $value = $e->href; // Set a attribute(If the attribute is non-value attribute (eg. checked, selected...), set it's value as true or false) $e->href = 'my link'; // Remove a attribute, set it's value as null! $e->href = null; // Determine whether a attribute exist? if(isset($e->href)) echo 'href exist!';
魔法属性
// Example $html = str_get_html("<div>foo <b>bar</b></div>"); $e = $html->find("div", 0); echo $e->tag; // Returns: " div" echo $e->outertext; // Returns: " <div>foo <b>bar</b></div>" echo $e->innertext; // Returns: " foo <b>bar</b>" echo $e->plaintext; // Returns: " foo bar"
属性名称 | 描述 |
---|---|
$e->tag |
读取或写入元素的 标签名称 。 |
$e->outertext |
读取或写入元素的 外部HTML文本 。 |
$e->innertext |
读取或写入元素的 内部HTML文本 。 |
$e->plaintext |
读取或写入元素的 纯文本 。 |
提示
// Extract contents from HTML echo $html->plaintext; // Wrap a element $e->outertext = '<div class="wrap">' . $e->outertext . '<div>'; // Remove a element, set it's outertext as an empty string $e->outertext = ''; // Append a element $e->outertext = $e->outertext . '<div>foo<div>'; // Insert a element $e->outertext = '<div>foo<div>' . $e->outertext;
遍历 DOM 树
如果您对 HTML DOM 不太熟悉,请查看此 链接 以了解更多信息...
// Example echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id; // or echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');
您还可以使用 Camel命名约定 (机翻)调用方法。
方法 | 描述 |
---|---|
$e->children( [int $index] ) : mixed |
如果设置了索引,则返回第 N个子对象,否则返回子数组。 |
$e->parent() : element |
返回元素的父元素。 |
$e->first_child() : element |
返回元素的第一个子元素,如果未找到则返回null 。 |
$e->last_child() : element |
返回元素的最后一个子元素,如果未找到则返回null 。 |
$e->next_sibling() : element |
返回元素的下一个兄弟元素,如果未找到则返回null 。 |
$e->prev_sibling() : element |
返回元素的前一个兄弟元素,如果未找到则返回null 。 |
保存 DOM 对象
面向过程
// 将内部DOM树转储回字符串 $str = $html; // 打印 echo $html;
面向对象
// 将内部DOM树转储回字符串 $str = $html->save(); // 将内部DOM树转储回文件 $html->save('result.htm');
自定义解析行为
// Write a function with parameter "$element" //使用参数“$element”编写函数 function my_callback($element) { // Hide all <b> tags if ($element->tag=='b') $element->outertext = ''; } // Register the callback function with it's function name //用其函数名注册回调函数 $html->set_callback('my_callback'); // Callback function will be invoked while dumping //转储时将调用回调函数 echo $html;
向 DOM 添加节点
解析器允许您向现有文档添加新元素。在下面找到一个例子。
备注
- 无法通过
->outertext
、->innertext
或->plaintext
创建节点。这些属性只更改节点的文本表示形式,如果使用不当,将返回不希望的结果。 - 使用
$html->createElement
和$html->createTextNode
创建新节点。 - 使用
$node->appendChild
将一个节点作为子节点添加到另一个节点。 - 节点可以以任何顺序组合。
例子
<?php // This example illustrates adding new elements to the DOM. require_once 'simple_html_dom.php'; /***************************** table data *************************************/ $header = array('Ocean', 'Volume (km^3)'); $data = array( array('Arctic Ocean', 18750000), array('Atlantic Ocean', 310410900), array('Indian Ocean', 264000000), array('Pacific Ocean', 660000000), array('Souce China Sea', 9880000), array('Southern Ocean', 71800000) ); /***************************** template ***************************************/ $doc = <<<EOD <html> <head> <style> table { border: 1px solid black; } tr:nth-child(even) { background: #CCC } tr:nth-child(odd) { background: #FFF } </style> </head> <body> <h1>Volumes of the World's Oceans</h1> </body> </html> EOD; /***************************** code *******************************************/ $html = str_get_html($doc); $body = $html->find('body', 0); $table = $html->createElement('table'); // Header row $tr = $html->createElement('tr'); foreach ($header as $entry) { $th = $html->createElement('th', $entry); $tr->appendChild($th); } $table->appendChild($tr); // Table data foreach ($data as $row) { $tr = $html->createElement('tr'); foreach ($row as $entry) { // (optional) Add info to the volume column if (is_numeric($entry)) { $value = number_format($entry); $td = $html->createElement('td', $value); $td->setAttribute('volume', $entry); } else { $td = $html->createElement('td', $entry); } $tr->appendChild($td); } $table->appendChild($tr); } $body->appendChild($table); echo $html . PHP_EOL; /** * Output (beautified) * * <html> * <head> * <style> * table { border: 1px solid black; } * tr:nth-child(even) { background: #CCC } * tr:nth-child(odd) { background: #FFF } * </style> * </head> * <body> * <h1>Volumes of the World's Oceans</h1> * <table> * <tr><th>Ocean</th><th>Volume (km^3)</th></tr> * <tr><td>Arctic Ocean</td><td volume="18750000">18,750,000</td></tr> * <tr><td>Atlantic Ocean</td><td volume="310410900">310,410,900</td></tr> * <tr><td>Indian Ocean</td><td volume="264000000">264,000,000</td></tr> * <tr><td>Pacific Ocean</td><td volume="660000000">660,000,000</td></tr> * <tr><td>Souce China Sea</td><td volume="9880000">9,880,000</td></tr> * <tr><td>Southern Ocean</td><td volume="71800000">71,800,000</td></tr> * </table> * </body> * </html> */
API 参考
解析文档
解析器接受 URL、文件和字符串形式的文档。该文档必须可供阅读,并且不能超过MAX_FILE_SIZE
.
名称 | 描述 |
---|---|
str_get_html( string $content ) : object |
从字符串创建一个 DOM 对象。 |
file_get_html( string $filename ) : object |
从文件或 URL 创建一个 DOM 对象。 |
DOM 方法和属性
姓名 | 描述 |
---|---|
__construct( [string $filename] ) : void |
构造函数,设置文件名参数将自动加载内容,文本或文件/url。 |
plaintext : string |
返回从 HTML 中提取的内容。 |
clear() : void |
清理内存。 |
load( string $content ) : void |
从字符串加载内容。 |
save( [string $filename] ) : string |
将内部 DOM 树转储回字符串。如果设置了 $filename,结果字符串将保存到文件中。 |
load_file( string $filename ) : void |
从文件或 URL 加载内容。 |
set_callback( string $function_name ) : void |
设置回调函数。 |
find( string $selector [, int $index] ) : mixed |
通过 CSS 选择器查找元素。如果设置了索引,则返回第 N 个元素对象,否则返回对象数组。 |
元素方法和属性
姓名 | 描述 |
---|---|
[attribute] : string |
读取或写入元素的属性值。 |
tag : string |
读取或写入元素的标签名称。 |
outertext : string |
读取或写入元素的外部 HTML 文本。 |
innertext : string |
读取或写入元素的内部 HTML 文本。 |
plaintext : string |
读取或写入元素的纯文本。 |
find( string $selector [, int $index] ) : mixed |
通过 CSS 选择器查找子级。如果设置了索引,则返回第 N 个元素对象,否则返回对象数组。 |
DOM 遍历
姓名 | 描述 |
---|---|
$e->children( [int $index] ) : mixed |
如果设置了索引,则返回第 N 个子对象,否则返回子对象数组。 |
$e->parent() : element |
返回元素的父元素。` |
$e->first_child() : element |
返回元素的第一个子元素,如果未找到则返回 null。 |
$e->last_child() : element |
返回元素的最后一个子元素,如果未找到则返回 null。 |
$e->next_sibling() : element |
返回元素的下一个兄弟元素,如果未找到则返回 null。 |
$e->prev_sibling() : element |
返回元素的前一个兄弟元素,如果未找到则返回 null。 |
骆驼命名约定 (机翻)
方法 | 映射 |
---|---|
$e->getAllAttributes() |
$e->attr |
$e->getAttribute( $name ) |
$e->attribute |
$e->setAttribute( $name, $value) |
$value = $e->attribute |
$e->hasAttribute( $name ) |
isset($e->attribute) |
$e->removeAttribute ( $name ) |
$e->attribute = null |
$e->getElementById ( $id ) |
$e->find ( "#$id", 0 ) |
$e->getElementsById ( $id [,$index] ) |
$e->find ( "#$id" [, int $index] ) |
$e->getElementByTagName ($name ) |
$e->find ( $name, 0 ) |
$e->getElementsByTagName ( $name [, $index] ) |
$e->find ( $name [, int $index] ) |
$e->parentNode () |
$e->parent () |
$e->childNodes ( [$index] ) |
$e->children ( [int $index] ) |
$e->firstChild () |
$e->first_child () |
$e->lastChild () |
$e->last_child () |
$e->nextSibling () |
$e->next_sibling () |
$e->previousSibling () |
$e->prev_sibling () |
常量
常量定义解析器如何处理文档。可以在加载解析器之前定义它们以全局替换默认值。
DEFAULT_TARGET_CHARSET
定义解析器返回的文本的默认目标字符集。
默认:'UTF-8'
DEFAULT_BR_TEXT
<br>
定义要为元素返回的默认文本。
默认:"\r\n"
DEFAULT_SPAN_TEXT
<span>
定义要为元素返回的默认文本。
默认:' '
MAX_FILE_SIZE
定义解析器可以加载到内存中的最大字节数。此限制仅适用于源文件或字符串。
默认:600000
定义
下面的定义是解析器的重要组成部分。
节点类型
节点的类型在解析期间确定,并由下面列表中的元素之一表示。
类型 | 描述 |
---|---|
HDOM_TYPE_ELEMENT |
开始标签(即<html> ) |
HDOM_TYPE_COMMENT |
HTML 注释(即<!-- Hello, World! --> ) |
HDOM_TYPE_TEXT |
纯文本(即Hello, World! ) |
HDOM_TYPE_ENDTAG |
结束标签(即</html> ) |
HDOM_TYPE_ROOT |
根元素。DOM 中始终只能有一个根元素。 |
HDOM_TYPE_UNKNOWN |
未知类型(即 CDATA、DOCTYPE 等...) |
例子
<!DOCTYPE html><html><!-- Hello, World! --></html>Hello, World!
注意: HDOM_TYPE_ROOT
无论实际文档结构如何,始终存在。
HTML | 节点类型 |
---|---|
HDOM_TYPE_ROOT |
|
<!DOCTYPE html> |
HDOM_TYPE_UNKNOWN |
<html> |
HDOM_TYPE_ELEMENT |
<!-- Hello, World! --> |
HDOM_TYPE_COMMENT |
</html> |
HDOM_TYPE_ENDTAG |
Hello, World! |
HDOM_TYPE_TEXT |
报价单类型
标识属性值的引用类型。
类型 | 描述 |
---|---|
HDOM_QUOTE_DOUBLE |
双引号 ( "" ) |
HDOM_QUOTE_SINGLE |
单引号 ( '' ) |
HDOM_QUOTE_NO |
未引用(标志) |
注意: 没有值(标志)的属性存储为HDOM_QUOTE_NO
.
例子
<p class="paragraph" id='info1' hidden>Hello, World!</p>
属性 | 描述 |
---|---|
class="paragraph" |
HDOM_QUOTE_DOUBLE |
id='info1' |
HDOM_QUOTE_SINGLE |
hidden |
HDOM_QUOTE_NO |
节点信息类型
每个节点存储由以下元素标识的附加信息(元数据)。
类型 | 描述 |
---|---|
HDOM_INFO_BEGIN |
节点开始标记的光标位置。 |
HDOM_INFO_END |
节点结束标记的光标位置。零值表示没有结束标记的节点(缺少结束标记)。 |
HDOM_INFO_QUOTE |
属性值的引用类型。该值必须是Quote Type的元素。 |
HDOM_INFO_SPACE |
属性周围的空白数组(请参阅Attribute Whitespace)。 |
HDOM_INFO_TEXT |
标签中的非 HTML 文本(即评论、文档类型等)。 |
HDOM_INFO_INNER |
节点的内部文本。 |
HDOM_INFO_OUTER |
节点的外部文本。 |
HDOM_INFO_ENDSPACE |
结束括号前标签末尾的空格。 |
属性空白
属性周围的空格以包含三个元素的数组的形式存储:
元素 | 描述 |
---|---|
0 |
属性名称前的空格。 |
1 |
属性名称和等号之间的空格。 |
2 |
等号和属性值之间的空格 |
例子
<p class="paragraph" id = 'info1'hidden>Hello, World!</p>
注意: 属性名称前的空格不会显示在浏览器中。然而,它是属性的一部分。
属性 | 描述 |
---|---|
class="paragraph" |
[0] => ' ', [1] => '', [2] => '' |
id = 'info1' |
[0] => ' ', [1] => ' ', [2] => ' ' |
hidden |
[0] => '', [1] => '', [2] => '' |
str_get_html
str_get_html ( string $str [, bool $lowercase = true [, bool $forceTagsClosed = true [, string $target_charset = DEFAULT_TARGET_CHARSET [, bool $stripRN = true [, string $defaultBRText = DEFAULT_BR_TEXT [, string $defaultSpanText = DEFAULT_SPAN_TEXT ]]]]]] )
解析提供的字符串并返回 DOM 对象。
范围 | 描述 |
---|---|
str |
HTML 文档字符串。 |
lowercase |
如果启用,则强制标记小写匹配。这在加载具有混合命名约定的文档时非常有用。 |
forceTagsClosed |
过时的。解析器不再使用此参数。 |
target_charset |
从文档返回文本时定义目标字符集。 |
stripRN |
如果启用,则在解析文档之前删除换行符。 |
defaultBRText |
定义要为元素返回的默认文本。 |
defaultSpanText |
定义要为元素返回的默认文本。 |
file_get_html
file_get_html ( string $url [, bool $use_include_path = false [, resouce $context = null [, int $offset = 0 [, int $maxLen = -1 [, bool $lowercase = true [, bool $forceTagsClosed = true [, string $target_charset = DEFAULT_TARGET_CHARSET [, bool $stripRN = true [, string $defaultBRText = DEFAULT_BR_TEXT [, string $defaultSpanText = DEFAULT_SPAN_TEXT ]]]]]]]]]] )
解析提供的文件并返回 DOM 对象。
范围 | 描述 |
---|---|
url |
要读取的文件的名称或 URL。 |
use_include_path |
看file_get_contents |
context |
看file_get_contents |
offset |
看file_get_contents |
maxLen |
看file_get_contents |
lowercase |
如果启用,则强制标记小写匹配。这在加载具有混合命名约定的文档时非常有用。 |
forceTagsClosed |
过时的。解析器不再使用此参数。 |
target_charset |
从文档返回文本时定义目标字符集。 |
stripRN |
如果启用,则在解析文档之前删除换行符。 |
defaultBRText |
定义要为元素返回的默认文本。 |
defaultSpanText |
定义要为元素返回的默认文本。 |
评论(0)