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

哪个HTML解析器(最好是PHP)支持获取输入字符串中当前节点的偏移量?,php,html-parsing,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

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

Lorem ipsum dolor sit amet,奉献精英

这是临时性的劳动和就业机会

我正在寻找一种方法来获取每个
标记的起始位置(包括空格),这里是:
7
72

如果PHP解析器在本机上支持这一点(我已经看过了,还有在中提到的其他库,但还没有找到实现这一点的方法),那就太好了,否则任何语言/框架都可以


注意:与相关,但本地化程度较低。

如果您不介意使用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 );
        }   
    }   
}
在PHP中,有一个类似的函数:

int strrpos ( string $haystack , string $needle [, int $offset = 0 ] )
您可以快速查看有关它的“手册”页面(其中有一些示例):

也许您可以使用(也可以打开)。
根据作者的描述:

  • 解析任意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]);
    }
}

?>
因此,
Byte
字段可能就是您要查找的内容。

为了更好地理解它是如何工作的,还可以看看它的。

不完全相同,但是:@Gordon让我担心的是它似乎非常不可靠。如果它是一个潜在的libxml2错误,正如在该页面上断言的那样,我可能需要找到一个非基于libxml2的解决方案。另一件事是,我需要的是当前行的偏移量,而不仅仅是行号。我很好奇你为什么需要它。解析器的要点是将序列化的XML解析为某种类型的数据结构,然后对其进行修改并序列化回XML。节点在原始XML字符串中的位置信息似乎与此无关。至少我没有看到这个用例。我正在构建一个EPUB阅读系统,其中突出显示“句子”(有时跨越多个XML节点),并将其位置存储为HTML文件中开始字符和结束字符的偏移量。我为pascal编写了一个跟踪偏移量的HTML解析器。我猜它不会对您有多大帮助,尽管它也可以读取大多数xml文件……而不是OP想要的。这不是使用XML/HTML解析器,对于任何未完全按照

编写的P元素(例如,具有属性或大写)都将失败。然后使用正则表达式而不是固定字符串我怀疑他是否会找到关心输入字符串位置的解析器,因为所有的意图解析器都是为了消除这些顾虑。使用stripos而不是strrpos,因为stripos不区分大小写,只需搜索“@RimuAtkinson我不只是在寻找标记(所有类型的标记)谢谢你的回答。我有点担心这个图书馆看起来有点模糊——我现在会继续寻找。你知道这个图书馆是否还保留着吗?还有其他建议吗,可能是关于语言/等等?@julien_c最后一次文档更改日期是2012-09-05,所以我想图书馆仍然保留着。图书馆使用下面是解析器函数。例如,请看一看该函数。
<?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]);
    }
}

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