Я ищу 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, но не нашел способа сделать это), но в противном случае любой язык / структура будет хорошо.
Примечание. В связи с этим вопросом , но менее локализованным.
Возможно, вы могли бы использовать Generic XML parser class (также на github ).
Согласно описанию автора:
Я тестировал его с помощью этого кода:
<?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