次のテキストがあります。
$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
\r
explode(PHP_EOL, $text);
これを試しましたか?
$array = explode("\n", $test);