1

で奇妙な問題が発生していpreg_replaceます。単一の文字列で正常に動作するようですが、大きなテキストファイル(〜1.5MB)を持ってくると、何も起こらないようです。

この種の構造を持つキー値の大きなテキストファイルを解析しようとしています。

"KeyValues"
{
    "Key1" "Value1"
    // a comment
    "ComplexKey" 
    {
        "ComplexKey1" "ComplexValue1" // another comment
        "ComplexKey2" "ComplexValue2"
        "FurtherComplexity1" 
        {
            "ComplexKey3" "ComplexValue3"
            "ComplexKey4" "ComplexValue4"
        }
    }
}

解析を行う前に、テキストファイルからコメントを削除しようとしています。 preg_replace安全な賭けのようでした。コメントを削除するためのコードは次のとおりです。

<?php

$filecontent = file_get_contents('file.txt');
$filecontent = preg_replace('!//.*!s', '', $filecontent);

echo $filecontent;

?>

コメントなしで上記の例を出力することを期待していますが、最初とまったく同じ文字列を返すだけです。それが奇妙になるところは、テキストファイルから1行を取り出します。たとえば、次のようになります。

        "ComplexKey1" "ComplexValue1" // another comment

その文字列に対して呼び出しを実行するpreg_replaceと、コメントなしで文字列が返されます。正規表現に一致しない改行文字があったためかもしれないと思ったので、式に「s」修飾子を追加しました。ただし、これで問題が解決したようには見えませんでした。何らかの理由で、私のpreg_replace呼び出しは何もしません(または私の正規表現がオフになっています)。

明らかな解決策は、解析でコメントを無視することですが、これが機能しない理由については、ここで欠落していることがあるに違いないと思います。可能であれば、パーサーを変更せずにこれを修正したいと思います。何か案は?

4

2 に答える 2

3
$filecontent = preg_replace('!//.*$!m', '', $filecontent);

m修飾子は、入力テキストの処理を1行ずつ変更します

デフォルトでは、PCREはサブジェクト文字列を文字の単一の「行」で構成されているものとして扱います(実際には複数の改行が含まれている場合でも)。「行の先頭」メタ文字(^)は文字列の先頭でのみ一致し、「行の終わり」メタ文字($)は文字列の末尾、または終了改行の前でのみ一致します(D修飾子が設定されていない場合) )。これはPerlと同じです。この修飾子が設定されている場合、「行の開始」と「行の終わり」の構成は、それぞれ、件名文字列の改行の直後または直前、および開始と終了で一致します。これは、Perlの/m修飾子と同等です。件名文字列に「\n」文字が含まれていない場合、またはパターンに^または$が含まれていない場合、この修飾子を設定しても効果はありません。

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

于 2012-09-29T07:58:33.453 に答える
0

これはJSONのように見えます

使える

json_decode($mydata,true) 

テキスト ファイル全体を素敵なマルチ レベルの php 配列に変換します。

于 2012-09-29T08:24:36.770 に答える