たぶん、汎用 XML パーサー クラスを使用できます( githubにもあります)。
著者の説明によると:
- 任意の XML 入力を解析し、すべてのタグとデータ要素の構造を持つ配列を構築します。
- たった 1 回の呼び出しで、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
フィールドはおそらくあなたが探しているものです。
それがどのように機能するかをよりよく理解するには、そのソースコードも見てください。