Ответ 1
Возможно, вы могли бы использовать 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-фрагмента.
Запустив script из командной строки, я получаю этот вывод:
Array
(
[Line] => 2
[Column] => 7
[Byte] => 12
)
Array
(
[Line] => 3
[Column] => 7
[Byte] => 80
)
Итак, поле Byte
- это, вероятно, то, что вы ищете.
Чтобы лучше понять, как это работает, посмотрите также исходный код.