2

次のテキストがあります。

$test = 'Test This is first line

Test:123

This is Test';

この文字列を段落の配列に分解したいと思います。次のコードを書きましたが、機能しません。

$array = explode('\n\n', $test);

ここで何が欠けているのか分かりますか?

4

6 に答える 6

7

\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 でのみサポートされていることに注意してください。したがって、ある意味では、クロスフレーバーの互換性が低くなります。

于 2013-07-16T09:53:18.717 に答える
3

あなたのコード

$array = explode('\n\n', $test);

\n\n二重引用符で囲む必要があります:

$array = explode("\n\n", $test);

$test一重引用符を使用して、リテラルの変数を調べます\n\n。二重引用符を使用すると、評価された値\n\nが 2 つのキャリッジ リターンであるものが検索されます。

また、行末はホスト オペレーティング システムによって異なることに注意してください。Windows は\r\nの代わりに使用し\nます。事前定義された定数を使用して、オペレーティング システムの行末を取得できますPHP_EOL

于 2013-07-16T09:53:54.670 に答える
1

あなたが説明したように、このテキストを配列に入れる最も簡単な方法は次のとおりです。

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);

于 2013-07-16T10:03:30.537 に答える
0

これを試しましたか?

$array = explode("\n", $test);
于 2013-07-16T09:57:06.063 に答える