kuria/simple-html-parser

简洁的HTML解析器

v2.0.0 2018-03-13 21:43 UTC

This package is auto-updated.

Last update: 2024-09-22 18:20:33 UTC


README

简洁的HTML解析器。

https://travis-ci.cn/kuria/simple-html-parser.svg?branch=master

注意

如果您需要高级DOM操作,请考虑使用 kuria/dom

内容

特性

  • 解析开标签
  • 解析闭标签
  • 解析注释
  • 解析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"