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


Which HTML Parser (preferably PHP) supports getting the offset of the current node in the input string?

我正在寻找一个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>

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

如果PHP解析器本地支持该功能就太好了(我已经研究了DOM、XMLReader和这个SO问题中提到的其他库,但还没有找到实现它的方法),但其他任何语言/框架都可以。

注:与此问题相关,但不太本地化

也许你可以使用Generic XML解析器类(也在github上)。
根据作者的描述:

  • 解析任意XML输入,并使用所有标记和数据元素的结构构建数组。
  • 它可以通过一个调用从整个XML文档中验证和提取数据。它支持验证常见的标签值数据类型,并可以使用子类执行自定义验证。
  • 可选地跟踪每个元素的位置,以便确定可能在上下文中出错的元素的确切位置。
  • 支持解析后的文件缓存,以尽量减少重复解析同一文件的开销。
  • 简化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]);
    }
}
?>

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

Array
(
    [Line] => 2
    [Column] => 7
    [Byte] => 12
)
Array
(
    [Line] => 3
    [Column] => 7
    [Byte] => 80
)

所以,Byte字段可能就是你要找的。
为了更好地理解它是如何工作的,还可以查看它的源代码。

如果您不介意在Java中编码(Java代码之后有PHP解决方案),您可以在String类中使用indexOf方法,获取此令牌的偏移量。

下面是一个例子:

class Index {
    public static void main ( String [] args )
    {   
        String token = "<p>";
        String input = "<p> hola </p> <p> adios </a>";
        int beginIdx = -1; 
        while ( (beginIdx = input.indexOf( token, beginIdx + 1 )) != -1 ) {                                                                                                                                         
            System.out.println( "Token at: " + beginIdx );
        }   
    }   
}

输出为:

Token at: 0
Token at: 14
在PHP中有一个类似的函数:
int strrpos ( string $haystack , string $needle [, int $offset = 0 ] )

您可以快速查看"man"页面(它有一些示例):http://php.net/manual/es/function.strrpos.php