4

入力文字列またはファイルの現在の要素のオフセット/位置にアクセスできる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パーサーがそれをネイティブにサポートしていれば素晴らしいでしょう(私はDOMXMLReader、およびこのSOの質問で言及されている他のライブラリを調べましたが、それを行う方法を見つけていません)が、そうでなければ、任意の言語/フレームワークは大丈夫。

注:この質問に関連していますが、ローカライズされていません。

4

2 に答える 2

6

たぶん、汎用 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フィールドはおそらくあなたが探しているものです。
それがどのように機能するかをよりよく理解するには、そのソースコードも見てください。

于 2013-01-23T21:33:15.177 に答える
0

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

于 2013-01-23T11:52:18.613 に答える