-1

データベースからいくつかのコメント行を取得しようとしています。それらは「\n」で区切られた文字列として保存されています。残念ながら、一部のコメントにはテキストが含まれています-「\ n」も含まれていますが、それに応じてそれらを区切ることはできません。

コメントの例は次のようになります。

27.11.2012 13:19 (MB): test123
27.11.2012 13:20 (MB): test456
27.11.2012 13:21 (JA): test789
lalala
lululu
27.11.2012 13:22 (JA): test10

ここで、正規表現と preg_split() を使用してそれらを分離しようとしました。

#(\d{2}\.\d{2}\.20[0123]{2} \d{2}:\d{2} \([A-Z]{2,3}\): .*)#
(PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)

しかし、私は得る

Array
(
    [0] => 27.11.2012 13:19 (MB): test123
    [1] => 
    [2] => 27.11.2012 13:20 (MB): test456
    [3] => 
    [4] => 27.11.2012 13:21 (JA): test789
    [5] => 
lalala
lululu
    [6] => 27.11.2012 13:22 (JA): test10
)

それらを組み合わせるにはどうすればよいですか?

4

1 に答える 1

0

正規表現のドットは改行と一致しないため.*、行末に移動します。一見空の行には改行が含まれています。したがって.*、分割パターンから を削除し、残りを で使用しPREG_SPLIT_DELIM_CAPTUREます。

(\d{2}\.\d{2}\.20[0123]{2} \d{2}:\d{2} \([A-Z]{2,3}\):)

各行はコロンで 2 つの部分に分割されます。次に、文字列をペアで結合して元の行を取得できます (または、フィールドを分離する必要がある場合に、プログラムの次のステップで文字列を分割する手間を省くことができます)。

入力行を分割するという考えが本当に嫌いな場合:

  1. preg_match_all割る代わりに使います。
  2. PCRE_DOTALL( s) フラグを追加しての意味を変更し、.改行にも一致するようにします。
  3. これにより、最初の.*一致がファイルの最後まで行われるため、貪欲ではないものにします.*?

ここで、次の日付パターンまですべてを一致させる必要がありますが、その直前で停止ます。これは、先読み式で正規表現を終了することで表現できます。一致したグループが分離されるため、一致したパターンに明示的に配置する必要がなくなりました。

つまり、次のパターンを試してください (sフラグを接尾辞として追加しましたが、もちろん個別に渡すこともできます):

/(.*?)\n(?=\d{2}\.\d{2}\.20[0123]{2} \d{2}:\d{2} \([A-Z]{2,3}\):)/s

コメント: 私は先読み/後読みをできるだけ避けています。その理由はおそらくおわかりでしょう。2 部構成のソリューションの方がシンプルで保守しやすいと思いますが、ここでは先読みが理にかなっています。

PS。ファイル形式を変更できる場合は、csv 形式に変換して、fgetcsvまたは同様のもので読み取ることを検討してください。

于 2012-11-27T21:18:03.300 に答える