哪个HTML Parser(最好是PHP)支持在输入字符串中获取当前节点的偏移量?

jul*_*n_c 4 php html-parsing

我正在寻找一个HTML或XML解析器,让一个访问当前元素的偏移/位置输入字符串或文件.

例如,如果遍历此字符串:

<div>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
    <p>sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
</div>
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来获取每个<p>标签的起始位置(包括空白),这里:772.

如果一个PHP解析器原生支持它会很棒(我看过这个SO问题中提到的DOM,XMLReader和其他库,但还没有找到方法)但是否则任何语言/框架都会精细.

注意:与此问题相关,但本地化程度较低.

小智 6

也许你可以使用Generic XML parser类(也在github上).
根据作者的描述:

  • 解析任意XML输入并使用所有标记和数据元素的结构构建数组.
  • 它只需一次调用即可验证并从整个XML文档中提取数据.它支持validationg公共标记值数据类型,并可以使用子类执行自定义验证.
  • 可选地,跟踪每个元素的位置以允许确定可能在上下文中出错的元素的确切位置.
  • 支持解析的文件缓存,以最大限度地减少重复解析同一文件的开销.
  • 优化解析简化XML(SML)格式,忽略标记属性.
  • 使用单个函数调用验证并从整个XML文档中提取数据

我用这段代码测试了它:

<?php

require('xml_parser.php');

$file_name = 'test.xml';
$error = XMLParseFile($parser, $file_name, 1, $file_name.'.cache');

foreach ($parser->structure as $key => $val) {
    if (is_array($val) && isset($val['Tag']) && !strcasecmp($val['Tag'], 'p')) {
        print_r($parser->positions[$key]);
    }
}

?>
Run Code Online (Sandbox Code Playgroud)

test.xml文件包含示例HTML代码段.
通过从命令行运行脚本,我得到以下输出:

Array
(
    [Line] => 2
    [Column] => 7
    [Byte] => 12
)
Array
(
    [Line] => 3
    [Column] => 7
    [Byte] => 80
)
Run Code Online (Sandbox Code Playgroud)

所以,这个Byte领域可能正是你所寻找的.
为了更好地理解它的工作原理,还要看一下它的源代码.