文字列を配列に入れ、改行で分割するにはどうすればよいですか?


220

データベースに改行のある文字列があります。その文字列を配列に変換し、新しい行ごとに、配列内の1つのインデックス位置をジャンプします。

文字列が次の場合:

My text1
My text2
My text3

私が望む結果はこれです:

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)

1
PHPは知りませんが、通常は文字列用の「split」という関数があります。これは次のように機能します:array = split(string、 "\ n")
Sedat Kapanoglu

おそらく、最初に改行を正規化する必要があります。このメソッドs($yourString)->normalizeLineEndings()は、github.com / delight-im / PHP-Str(MITライセンスに基づくライブラリ)で使用できます。このライブラリには、他の多くの便利な文字列ヘルパーがあります。ソースコードを確認することをお勧めします。
16

回答:


290

explode\n」を区切り文字として使用して、関数を使用できます。

$your_array = explode("\n", $your_string_from_db);

たとえば、次のコードがある場合:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);
var_dump($arr);

次の出力が得られます。

array
  0 => string 'My text1' (length=8)
  1 => string 'My text2' (length=8)
  2 => string 'My text3' (length=8)


あなたが使用していることに注意してください、二重引用符で囲まれた文字列は、その\n実際に改行として解釈されます。
(詳細については、そのマニュアルページを参照してください。)


52
代わりに\n、事前定義された定数を使用できますPHP_EOL
ティム

40
すべての改行で機能するわけではないので、このソリューションには誰もが注意してください。私はダビデの答えで最も成功しました
モーリス

1
すべての種類のテキストを処理できるようにするには、\ nまたは\ rのいずれかで分割する必要があります。これは、LinuxおよびWindowsの改行でのみ機能します。Macの改行は無視されます!(\ r)
Steve Horvath

1
あなたのシステムの改行にのみ一致するため、Timsの回答/コメントは正しくないと思いますが、他のシステムから改行のある文字列を取得すると機能しません。メールにこの問題がありました
Asara 2016年

7
いいえ、この回答とこの回答のコメントは間違っています。これはOSの改行文字を考慮に入れていないためPHP_EOLです。を使用する必要がありますpreg_split("/\\r\\n|\\r|\\n/", $value)
kjdion84 2017

330

私はいつもこれを使って大きな成功を収めてきました:

$array = preg_split("/\r\n|\n|\r/", $string);

(最後の\ rで更新、@ LobsterManに感謝)


11
この答えはパスカルの代わりに一番上にあるべきです。それはすべてのケースでうまくいきませんでした。
Jithesh Kt 2014

1
これが答えです。検証済みのものは間違っています。まあ、ヘッセルボムにもあります...次の同等のものを使用することもできます。preg_split( '/ \ n | \ r /'、$ string、-1、PREG_SPLIT_NO_EMPTY); 美しさのために:)なぜこれが唯一の良い答えなのですか?取得する行末のタイプを想定できないため:Mac(\ r)、Windows(\ r \ n)、またはUnix(\ n)。
Ninj、2015年

2
\R 一致 \n\rおよび\r\n
mpen 2016年

1
それより短い/\r?\n/
Jason Schilling

この例は正解です。単一の文字に基づく分割操作だけを行うことはできないためです。その場合、「\ r」または「\ n」でトリガーすると、Windowsの「\ r \ n」が終了した場合に、余分な空行ができてしまいます。また、2文字のWindowsセパレータを最初にテストすることが重要です。
AndresRohrAtlasInformatik

281

改行は、\ r \ n、\ r、または\ nのプラットフォームごとに定義が異なります。

RegExpを使用して文字列を分割すると、3つすべてを\ Rで照合できます

だからあなたの問題について:

$array = preg_split ('/$\R?^/m', $string);

これは、Windows、Mac、Linuxの改行と一致します。


3
私はこのスレッドで受け入れられた回答やその他の回答の代わりにこれも使用しました。このコメントは参考情報として残してください。
セスマラキ

3
実際、これは私にはうまくいきませんでした。時々、配列キーにまだ存在する改行。
モーリス


32
使用するだけ$array = preg_split ('/\R/', $string);
Jan Goyvaerts 2013

18
時々動かない!preg_split("/\r\n|\n|\r/", $string)より良い選択
アレクセイB.

34

PHPは現在のシステムの改行文字をすでに認識しています。EOL定数を使用するだけです。

explode(PHP_EOL,$string)

18
はい。ただし、ファイルを編集したり、この例のようにWindowsのdbエントリを編集して、Linuxシステムで使用したりできます。一般的なアプローチの方が適していると思います。
Cranio

これが正しいかどうかはわかりません。Webページのテキスト領域が送信された場合、サーバーのオペレーティングシステムではなく、ユーザーのブラウザーに応じて、行末文字が異なる可能性があります。したがって、使用しているOSに関係なく、何でも解析できる必要があります。もちろん、これはWebに関することを前提としています。
マグマティック

次にtrim()、結果の文字列を使用して、無関係な空白を削除する必要があります。
Tim

30

より高速な(より高速な)Davidsの回答の代替は、str_replaceおよびを使用することexplodeです。

$arrayOfLines = explode("\n",
                    str_replace(["\r\n","\n\r","\r"],"\n",$str)
            );

何が起こっているのか:
改行はさまざまな形式で発生する可能性があるため、str_replace\ r \ n、\ n \ r、および\ rの代わりに\ nを使用します(元の\ nは保持されます)。
次に爆発し\n、すべての行が配列に含まれます。

このページのsrcでベンチマークを行い、forループで行を1000回分割し
preg_replaceました。平均は11秒
str_replace & explodeかかり、平均は約1 秒かかりました

フォーラムの詳細とベンマーク情報


フォーラムリンク(およびドメイン全体)がダウンしているようです
Nikita '2018

19

David:すばらしい方向ですが、\ rを逃しました。これは私のために働きました:

$array = preg_split("/(\r\n|\n|\r)/", $string);

11

文字列を改行で配列に正常に分割するために、preg_ *関数、pregパターン、str_replace withinなどは必要ありません。Linux / Macでもm $でも、すべてのシナリオでこれで十分です。

<?php 

 $array = explode(PHP_EOL, $string);
 // ...  
 $string = implode(PHP_EOL, $array);

?>

PHP_EOLは、サーバープラットフォームで使用される改行文字を保持する定数です。


3
ファイルは別の新しい行と他のシステム、PHPで使用されるウィッヒのためのネット環境でparticularryから来ることができました
ルカ・C.

これがまさにこの定数が存在する理由です。そして、その特定の問題を処理します。
不気味な

Windowsからファイルを取得する場合、unixまたはMacからのファイルと同じではありませんか?
Luca C.

常に純粋なutf-8をいつでもどこでも使用していて、utf8ファイルが含まれている場合、通常、Yoursのコード内に改行検出用のPHP_EOLしかなく、説明どおりに一致し、予期しない動作は発生しません。これを叫んで主張するのは私だけではないことに注意してください。PHP_EOLのユーザビリティはかなり確認されています。
不気味な2016

1
あなたの場合、ソースがどこか別の場所から来ていて、うまく形成されていない場合は、str_replace(regexpより高速)を使用する方が良いでしょう。...結局のところ、それは正規表現です。またはstr_replaceまたはPHP_EOLの場合、「動作する場合は、触れないでください!」という古き良き文章が1つあります。:)
不気味な


9

StackOverflowはヘッセルボムの答えにコメントすることを許可しない(十分な評判ではない)ので、私は自分の答えを追加しています...

$array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY);

これは、先頭(2番目の\ s *)と末尾(最初の\ s *)の空白を自動的に削除し、空白行をスキップする(PREG_SPLIT_NO_EMPTYフラグ)ため、私にとって最も効果的でした。

-=オプション=-

先頭の空白を保持したい場合は、2番目の\ s *を削除して、代わりにrtrim()にします...

$array = preg_split('/\s*\R/', rtrim($text), NULL, PREG_SPLIT_NO_EMPTY);

空の行を保持する必要がある場合は、NULL(これは単なるプレースホルダーです)とPREG_SPLIT_NO_EMPTYフラグを削除します。

$array = preg_split('/\s*\R\s*/', trim($text));

または、先頭の空白と空行の両方を維持します...

$array = preg_split('/\s*\R/', rtrim($text));

末尾の空白を引き続き使いたい理由はないので、最初の\ s *をそこに残すことをお勧めします。しかし、もしあなたが望むすべてが(タイトルが示唆するように)新しい行で分割することであるなら、これは簡単です(Jan Goyvaertsが述べたように)...

$array = preg_split('/\R/', $text);

m修飾子は本当に必要されていないことがありますか?のみ影響しないこと^$
mpen 2016年

@mpenはい、あなたは正しいと思います。私はそれをヘッセルボムのバージョンと一緒に運びました。投稿を編集します。
Deen Foxx 2017

7
<anti-answer>

他の回答で指定されているように、PHP 5.3.0以降では非推奨explodeとなったsplitためではなく、必ず使用してsplitください。すなわち、以下はあなたがそれをしたい方法ではありません

$your_array = split(chr(10), $your_string);

LF = "\ n" = chr(10)、CR = "\ r" = chr(13)

</anti-answer>

3

crontabにcronjobsを表示しようとし、各行を分離する方法に不満を感じる人は、explodeを使用します。

$output = shell_exec('crontab -l');
$cron_array = explode(chr(10),$output);

'\ n'を使用しても機能しないようですが、chr(10)は適切に機能します:D

これがいくつかの頭痛の種を救うことを願っています。


こんにちはジェフ、SOへようこそ。これは、他の誰かの質問に対する回答ではなく、質問と回答として書き直す必要があります。これは一般的なフォーラムではなく、Q&Aサイトです。FAQをご覧
レベッカスコット

使用する'\n'エスケープシーケンスを単一引用符で解釈されていないため、動作しない、あなたの代わりに二重引用符を使用する必要があります。"\n"代わりに'n'読み取りphp.net/manual/en/language.types.string.php
クリストファー・K.

2

あなたはこれを使うことができます:

 \str_getcsv($str,PHP_EOL);

2

$ string = nl2br($ string)を実行して、改行を次のように変更できます

<br />. 

この方法では、システムが\ r \ nまたは\ nまたは\ rを使用しているかどうかは関係ありません。

次に、それを配列にフィードできます。

$array = explode("<br />", $string);

注:nl2brは改行を置き換えません...各改行の前に改行タグを挿入するだけです。したがって、最初以外のすべての配列項目は改行で始まります。それが問題ではない場合は、この方法が最速です。それが重要な場合は、Jakarの答えが最速です。
アウスト・

2

それが私のやり方だ:

$lines = preg_split('/[\r\n]+/', $db_text, NULL, PREG_SPLIT_NO_EMPTY);

これもすべての空行をスキップします。


1
$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);

foreach ($arr as $line_num => $line) {
    echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}

真の配列:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);

$array = array(); // inisiasi variable array in format array

foreach ($arr as $line) { // loop line by line and convert into array
    $array[] = $line;
};

print_r($array); // display all value

echo $array[1]; // diplay index 1

オンラインで埋め込む:

body, html, iframe { 
  width: 100% ;
  height: 100% ;
  overflow: hidden ;
}
<iframe src="https://ideone.com/vE1gst" ></iframe>


現在の問題を修正する方法で、この答えのヘルプOPのための答えを持ついくつかの説明を追加
ρяσѕρєяK

1

これをphpドキュメントで拾いました:

<?php
  // split the phrase by any number of commas or space characters,
  // which include " ", \r, \t, \n and \f

  $keywords = preg_split("/[\s,]+/", "hypertext language, programming");
  print_r($keywords);
?>

0

この方法は常に私にとってはうまくいきます:

$uniquepattern="gd$#%@&~#"//Any set of characters which you dont expect to be present in user input $_POST['text'] better use atleast 32 charecters.
$textarray=explode($uniquepattern,str_replace("\r","",str_replace("\n",$uniquepattern,$_POST['text'])));

1
コードの一部として宣誓を愛する。:)とにかく、\ nで置き換える方がより簡単で安全です(他の答えを見てください)。
Stefan Reich、

0

'base'パッケージのみを使用することも、単純な場合の解決策です。

> s <- "a\nb\rc\r\nd"
> l <- strsplit(s,"\r\n|\n|\r")
> l  # the whole list...
[[1]]
[1] "a" "b" "c" "d"
> l[[1]][1] # ... or individual elements
[1] "a"
> l[[1]][2]
[1] "b"
> fun <- function(x) c('Line content:', x) # handle as you wish
> lapply(unlist(l), fun)

-6

\nPHPの爆発を使用して文字列または改行の間に特殊文字を使用すると、これを実現できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.