で奇妙な問題が発生してい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
呼び出しは何もしません(または私の正規表現がオフになっています)。
明らかな解決策は、解析でコメントを無視することですが、これが機能しない理由については、ここで欠落していることがあるに違いないと思います。可能であれば、パーサーを変更せずにこれを修正したいと思います。何か案は?