Какой HTML Parser (желательно PHP) поддерживает получение смещения текущего узла во входной строке?

Я ищу 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> здесь: 7 и 72 .

Было бы здорово, если бы PHP-парсер поддерживал это изначально (я посмотрел на DOM , XMLReader и другие библиотеки, упомянутые в этом вопросе SO, но не нашел способа сделать это), но в противном случае любой язык / структура будет хорошо.

Примечание. В связи с этим вопросом , но менее локализованным.

Solutions Collecting From Web of "Какой HTML Parser (желательно PHP) поддерживает получение смещения текущего узла во входной строке?"

Возможно, вы могли бы использовать Generic XML parser class (также на 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), вы можете использовать метод indexOf в классе String , получив смещение, если этот токен.

Вот пример:

 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