kuria / simple-html-parser
简洁的HTML解析器
Requires
- php: >=7.1
Requires (Dev)
- kuria/dev-meta: ^0.1.0
This package is auto-updated.
Last update: 2024-09-22 18:20:33 UTC
README
简洁的HTML解析器。
注意
如果您需要高级DOM操作,请考虑使用 kuria/dom
。
内容
- 特性
- 要求
- 用法
- 创建解析器
- 遍历元素
- 元素数组结构
- 标签名和属性规范化
- 管理解析器状态
getHtml()
- 获取HTML内容getSlice()
- 获取HTML部分getSliceBetween()
- 获取两个元素之间的内容getLength()
- 获取HTML长度getEncoding()
- 确定HTML文档的编码getEncodingTag()
- 查找指定编码的meta标签usesFallbackEncoding()
- 检查是否使用后备编码setFallbackEncoding()
- 设置后备编码getDoctypeElement()
- 查找doctype元素escape()
- 转义字符串find()
- 匹配特定元素getOffset()
- 获取当前偏移量
- 示例:读取文档的标题
特性
- 解析开标签
- 解析闭标签
- 解析注释
- 解析DTD
- 提取HTML内容的部分
- 确定HTML文档的编码
- 处理“原始文本”标签(
<style>
,<script>
,<noscript>
等)
要求
- PHP 7.1+
用法
创建解析器
<?php use Kuria\SimpleHtmlParser\SimpleHtmlParser; $parser = new SimpleHtmlParser($html);
遍历元素
解析器实现了Iterator
接口,可以使用标准迭代方法遍历。
<?php foreach ($parser as $element) { print_r($element); }
<?php $parser->rewind(); if ($parser->valid()) { print_r($parser->current()); }
元素数组结构
每个元素都是一个数组,具有以下键。一些键仅适用于特定元素类型。
元素类型
SimpleHtmlParser::COMMENT
- 注释,例如<!-- foo -->
SimpleHtmlParser::OPENING_TAG
- 开标签,例如<span class="bar">
SimpleHtmlParser::CLOSING_TAG
- 闭标签,例如</span>
SimpleHtmlParser::OTHER
- 特殊元素,例如doctype,XML头SimpleHtmlParser::INVALID
- 无效或不完整的标签
标签名和属性规范化
仅包含ASCII字符的标签和属性名将转换为小写。
管理解析器状态
可以使用状态方法临时存储和/或还原解析器的状态。
pushState()
- 将解析器的当前状态推入堆栈popState()
- 弹出(丢弃)堆栈顶部的状态revertState()
- 弹出并恢复堆栈顶部的状态countStates()
- 计算堆栈上当前状态的数量clearStates()
- 丢弃所有状态
getHtml()
- 获取HTML内容
getHtml()
方法可用于获取整个HTML内容或单个元素的HTML。
<?php $parser->getHtml(); // get entire document $parser->getHtml($element); // get single element
getSlice()
- 获取HTML部分
getSlice()
方法返回HTML内容的一部分。
对于负数或越界的范围,返回空字符串。
<?php $slice = $parser->getSlice(100, 200);
getSliceBetween()
- 获取两个元素之间的内容
getSliceBetween()
方法返回两个元素之间的HTML内容(通常是开标签和闭标签)。
<?php $slice = $parser->getSliceBetween($openingTag, $closingTag);
getLength()
- 获取HTML长度
getLength()
返回HTML内容的总长度。
getEncoding()
- 确定HTML文档的编码
getEncoding()
方法尝试确定HTML文档的编码。
如果无法确定编码或不受支持,将使用后备编码。
此方法不会更改解析器的状态。
getEncodingTag()
- 查找指定编码的meta标签
getEncodingTag()
方法尝试在HTML文档的前1024字节中查找 <meta charset="...">
或 <meta http-equiv="Content-Type" content="...">
标签。
如果未找到标签,则返回 NULL
。
此方法不会更改解析器的状态。
usesFallbackEncoding()
- 检查是否使用后备编码
《usesFallbackEncoding()`》指示是否正在使用回退编码。这是在编码未指定或不受支持的情况下。
此方法不会更改解析器的状态。
setFallbackEncoding()
- 设置后备编码
《setFallbackEncoding()`》方法指定在文档未指定编码或指定了不受支持的编码时使用的编码。
回退编码必须由《htmlspecialchars()`》支持。
getDoctypeElement()
- 查找doctype元素
《getDoctypeElement()`》方法尝试在HTML文档的前1024字节中查找doctype。
如果没有找到doctype,则返回《NULL》。
escape()
- 转义字符串
《escape()`》方法使用HTML文档的编码通过《htmlspecialchars()`》转义字符串。
find()
- 匹配特定元素
《find()`》方法尝试从当前位置开始查找特定元素,可选地在大约给定数量的字节后停止。
如果没有匹配到元素,则返回《NULL》。
<?php $element = $parser->find(SimpleHtmlParser::OPENING_TAG, 'title');
getOffset()
- 获取当前偏移量
《getOffset()`》方法返回当前解析器的字节偏移量。
示例:读取文档的标题
<?php $html = <<<HTML <!doctype html> <meta charset="utf-8"> <title>Foo bar</title> <h1>Baz qux</h1> HTML; $parser = new SimpleHtmlParser($html); $titleOpen = $parser->find(SimpleHtmlParser::OPENING_TAG, 'title'); if ($titleOpen) { $titleClose = $parser->find(SimpleHtmlParser::CLOSING_TAG, 'title'); if ($titleClose) { $title = $parser->getSliceBetween($titleOpen, $titleClose); var_dump($title); } }
输出
string(7) "Foo bar"