次のテキストがあります。
$test = 'Test This is first line
Test:123
This is Test';
この文字列を段落の配列に分解したいと思います。次のコードを書きましたが、機能しません。
$array = explode('\n\n', $test);
ここで何が欠けているのか分かりますか?
\r\nの代わりに使用する Windows を使用している可能性があります\n。正規表現を使用して、次の方法でユニバーサルにすることができますpreg_split()。
$array = preg_split('#(\r\n?|\n)+#', $test);
パターン説明:
(: グループ 1 のマッチングを開始\r\n?|\n: 一致\r\n、\rまたは\n): マッチング グループ 1 の終了+: 1 回以上繰り返す+2 つの改行で分割する場合は、に置き換え{2,}ます。
更新:次を使用できます:
$array = preg_split('#\R+#', $test);
この広範な回答は、の意味をカバーしてい\Rます。これは PCRE/perl でのみサポートされていることに注意してください。したがって、ある意味では、クロスフレーバーの互換性が低くなります。
あなたのコード
$array = explode('\n\n', $test);
\n\n二重引用符で囲む必要があります:
$array = explode("\n\n", $test);
$test一重引用符を使用して、リテラルの変数を調べます\n\n。二重引用符を使用すると、評価された値\n\nが 2 つのキャリッジ リターンであるものが検索されます。
また、行末はホスト オペレーティング システムによって異なることに注意してください。Windows は\r\nの代わりに使用し\nます。事前定義された定数を使用して、オペレーティング システムの行末を取得できますPHP_EOL。
あなたが説明したように、このテキストを配列に入れる最も簡単な方法は次のとおりです。
preg_match_all('/.+/',$string, $array);
/./は行末記号を除く任意の文字に一致し、貪欲であるため+、改行に遭遇するまで、できるだけ多くの文字に一致します。
を使用preg_match_allすると、これも各行で確実に繰り返されます。これを試したところ、出力は次のようになりました。
array (
0 =>
array (
0 => '$test = \'Test This is first line',
1 => 'Test:123',
2 => 'This is Test\';',
),
)
また、環境によって改行が異なることに注意してください ( *NIX システムの場合、Windows の場合\nと比べて、場合によっては単純な場合もあります)。おそらく、あなたも試してみたいと思うかもしれません\r\n\rexplode(PHP_EOL, $text);
これを試しましたか?
$array = explode("\n", $test);