3

多数のトレースを含むログ ファイルを解析しようとしていますが、その一部には複数の行が含まれています。

例:

[trace-123] <request>This is a log line</request>
[trace-124] <reply>This is another log line

this is part of "[trace-124]" still.</reply>
[trace-125] <request>final log line.</request>

すべてのトレースの配列を取得するために preg_match_all を使用しようとしています。

$file = file_get_contents("traces.txt");
$tracePattern = "/(\[trace-[0-9]*+\]+[\s\S]*)(?<=\<\/reply>|\<\/request>)/";

preg_match_all($tracePattern,$file,$lines);

echo "<pre>";print_r($lines);echo "</pre>";

理想的には、結果が次のようになることを望みます。

Array
(
    [0] => [trace-123] <request>This is a log line</request>
    [1] => [trace-124] <reply>This is another log line

this is part of "[trace-124]" still.</reply>
    [2] => [trace-125] <request>final log line.</request>
)

しかし、実行すると、配列の1つの要素にすべてが含まれる配列が得られます。式を書いたときの目標は、基本的に次のものを探すことでした。

[trace-\[0-9]*\] 

その試合から次の試合までのすべてを見つけます。

見つけた

\[trace-[0-9]*+\].* 

かなりうまく機能しますが、改行があると機能しなくなります。

4

7 に答える 7

3

ここでは、次の方法がおそらくより良い方法です。

$results = preg_split('/\R(?=\[trace[^\]]*\])/', $text);
print_r($results);

見るworking demo

出力

Array
(
    [0] => [trace-123] <request>This is a log line</request>
    [1] => [trace-124] <reply>This is another log line

this is part of "[trace-124]" still.</reply>
    [2] => [trace-125] <request>final log line.</request>
)
于 2013-11-14T20:38:19.823 に答える
2

これは MULTI_LINE モードで機能します。先頭のスペースと末尾の改行を削除します。

編集:これは、行の先頭または先頭にあるアンカーと 「トレース」までの改行以外の空白の[trace- ]いずれかであると想定しています。
これは、
識別可能な唯一のレコード セパレータです。

 #  ^[^\S\n]*(\[trace-[^]]*\][^\n]*(?:(?!\s+\[trace-[^]]*\])\n[^\n]*)*)

 ^ [^\S\n]* 
 (
      \[trace- [^]]* \] [^\n]* 

      (?:
           (?! \s+ \[trace- [^]]* \] )
           \n [^\n]* 
      )*
 )

出力 (一重引用符で囲む)

 '[trace-123] <request>This is a log line</request>'
 '[trace-124] <reply>This is another log line

 this is part of "[trace-124]" still.</reply>'
 '[trace-125] <request>final log line.</request>'
于 2013-11-14T20:50:41.673 に答える
0

これは、フラグsをオンにして行う必要があります。

(\[trace-[0-9]+\].*?<\/(?:reply|request)>)

ライブデモ

于 2013-11-14T20:33:24.910 に答える
0

記号は、.改行を除くすべての文字を意味します。次の方法\nで変更を試みることができます。(.|\s)

#\[trace-[0-9]*+\](.|\s)*#

注:非キャプチャ括弧を使用できます(?: )

簡単に、フラグ「s」を追加します

#\[trace-[0-9]*+\].*#s
于 2013-11-14T20:25:46.780 に答える