新しい行でPHP文字列を分解する


253

シンプルでしょ?さて、これは機能していません:-\

$skuList = explode('\n\r', $_POST['skuList']);

28
単一引用符は、「この文字列を解析しない」ことを意味します。@ Select0rの答えはおそらくあなたが探しているものです。
ライアンキナル

3
新しい行を削除してphp文字列から返す方法の重複の可能性はありますか?これはすでに文字列その他のいくつかから確実にニュースラインを削除したものの複製でし。質問する前に、あやふやな検索機能を使用してください!
ゴードン

1
@ゴードン:ハ、私は他の質問でシュラプネル大佐が言ったことを見ました。ちょっと悲しいです。私の近い投票を追加します。
BoltClock

9
他の人が言及した単一引用符に加えて、CRLFペアは\r\nその逆ではありません。
Powerlord

1
それを覚えてみてください:\ R etur \ N
l00k

回答:


410

ベストプラクティス

最初の回答にコメントで述べたように、ベストプラクティスは、PHP定数を使用することですPHP_EOL現在のシステムのEOL(表し、行の最後に)。

$skuList = explode(PHP_EOL, $_POST['skuList']);

PHPは、コードをシステムから独立させるために使用できる他の非常に便利な定数を多数提供しています。このリンクを参照して、システムに依存しない便利なディレクトリ定数を見つけてください。

警告

これらの定数はページシステムを独立させますが、別のシステムに格納されているデータで定数を使用すると、あるシステムから別のシステムに移動するときに問題が発生する可能性があります。新しいシステムの定数は以前のシステムの定数とは異なる場合があり、格納されたデータは機能しなくなる可能性があります。したがって、データを格納する前に完全に解析して、システムに依存する部分を削除してください。

更新

アンドレアスのコメントは、私がここで提示する「ベストプラクティス」ソリューションは、説明されているユースケースには適用されないことを認識させました。サーバーのEOL(PHP)は、ブラウザー(任意のOS)が使用しているEOLとは何の関係もありません。しかし、それ(ブラウザ)が文字列の出所です。

@Alin_Purcaruのソリューション(3つ下)を使用して、すべてのベースをカバーしてください(そして彼の回答に賛成投票してください)。

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);

5
これは新しい答えですが、おそらく最良かつ正しく受け入れられた答えでしょう
frazras

それは奇妙です、それはPHPがあなたにそれをすることを望んでいる方法なのでです:)あなたは私にあなたのOSとPHPバージョンについての詳細、おそらくPasteBinまたはsthのコードの断片を教えてもらえますか?似てる?
Larzan

16
システムと入力ソースは互いに関係がないため、PHP_EOLは使用できません。ユーザーがWindowsに新しい行を入れ、PHPがLinuxで実行されている場合、結果が壊れる可能性があります。
バレル2016年

1
@barell正確に、それは私が「警告」の部分で説明する状況です;)質問はそれがデータベースに保存されている古い入力であることを明示的に述べていませんでした。「警告」の部分をお読みください。その状況をカバーしていることがわかります。
ラルザン

7
この答えは、このユースケースではまったく間違っています。この場合、PHP_EOL定数は使用しないでください。入力ソース(ユーザーのブラウザーなど)は、ご使用のシステムとは異なります。すべての異なる行末を処理するソリューションを使用します(Alin Purcaruからの回答)。
Andreas

241

すべてのケースをカバーします。入力がWindows環境からのものであるとは限りません。

$skuList = preg_split("/\\r\\n|\\r|\\n/", $_POST['skuList']);

または

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);

21
eolがの場合、これは空の配列要素になり\r\nます。それを防ぐために、いずれかを使用:preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);(注\r\nまたは簡単に言えばそのフラグを使用している場合不要になる)\r\n 前に\rpreg_split('/\r\n|\n|\r/', $_POST['skuList']);
webbiedave

2
@webbiedave PREG_SPLIT_NO_EMPTYはすばらしいですが、空の行は削除されます。これは望ましい場合と望ましくない場合があります。
jms 2013

このパターンは、何も存在しなくても成功するため、私にとってすべての文字に一致します。「?」は0または1回を意味するため、\ rと\ nの両方が存在しない場合でも一致する可能性があります。あなたは「修正済み」と言いますが、私にはわかりません。代わりに/(\ r | \ n)+ /を使用しました。
Rolf

1
@ロルフ急いで編集したようです。今それを修正しました。何を使用するかは、出力に空の行が必要かどうかによって異なります。私の回答のオプションでも空の行が返されます。
Alin Purcaru 2013

3
@AlinPurcaru回答で、どちら(どちらか、どちらでもない?)が空白を返すか、どちらを返さないかを明確にできますか?
Patrick

150

"\n\r"(二重引用符)または単にを試してください"\n"

EOLのタイプがわからない場合は、分解の前にstr_replaceを実行し、「\ n \ r」を「\ n」に置き換えます。


52
PHPの単一引用符は、「この文字列を解析しない」ことを意味します。つまり、制御文字は解析されず、リテラルとして解釈されます(改行やキャリッジリターンではなく、実際のリテラル '\ n \ r')。二重引用符を使用すると、「この文字列を解析する」ことを意味するため、制御文字が解析されます。+1
ライアンキナル

17
/n/r?OPが書いたことは知っていますが、正しいWindows \r\n
EOL

20
PHP の行末定数を考慮してくださいPHP_EOL
ダニエルW.

皆さんこんにちは、これは間違いなく正しい答えです!@Alin Purcaruの回答が44票だったのはなぜでしょうか。仕事が..だからここに同じことに誰もstuckingのための私のコメントだんようですが、それは常に正しく働いていない
ラフィクバーリ

3
\ rを無視してください。\ nなしで最後に使用するOSはOS9(en.wikipedia.org/wiki/Newline#Representations)でした。したがって、これにより最良の結果が得られますexplode("\n", str_replace("\r", '', $string));
。– DanielM

15

ここにたくさんのこと:

  • 一重引用符ではなく二重引用符を使用する必要があります。そうしないと、エスケープされた文字はエスケープされません。
  • 通常のシーケンスは\r\nではなく\n\rです。
  • ソースに応じて、あなただけ取得することができる\nことなく、\r(あるいは珍しい例では、おそらくちょうど\r

最後の点を考えると、考えられるpreg_split()すべてのバリアントを使用すると、よりも信頼性の高い方法でデータを分割できることがわかりますexplode()。しかし、別の方法としてexplode()、単にを使用してから\n、を使用trim()して、\rぶら下がったままになっている文字を削除することもできます。


すばらしい答えです。簡潔に、すべてをカバーしています。ありがとう!
Kosta Kontos

11

このphp関数は改行によって文字列を分解します

注意Windowsの改行\ r \ nで、LinuxUnixの場合\ n
この関数はすべての改行Linuxモードに変更してから分割します。
空の行は無視されることに注意してください

function splitNewLine($text) {
    $code=preg_replace('/\n$/','',preg_replace('/^\n/','',preg_replace('/[\r\n]+/',"\n",$text)));
    return explode("\n",$code);
}


$a="\r\n\r\n\n\n\r\rsalam\r\nman khobam\rto chi\n\rche khabar\n\r\n\n\r\r\n\nbashe baba raftam\r\n\r\n\r\n\r\n";
print_r( splitNewLine($a) );

出力

Array
(
    [0] => salam
    [1] => man khobam
    [2] => to chi
    [3] => che khabar
    [4] => bashe baba raftam
)


6

新しいラインの場合、それは

$list = explode("\n", $text);

新しい行とキャリッジリターン(Windowsファイルの場合など)の場合は、投稿したとおりです。skuListはテキスト領域ですか?


4

置き\n、二重引用符で:

explode("\n", $_POST['skuList']);

私は間違っていない場合は、単一引用符では、これはとして扱われる\n別途。



3

完璧ではありませんが、私はそれが最も安全であるに違いないと思います。nl2brを追加します。

$skuList = explode('<br />', nl2br($_POST['skuList']));


1

見た目と同じくらい簡単

$skuList = explode('\\n', $_POST['skuList']);

正確なテキスト"\ n"を渡すだけで、\ nを直接書き込むことがエスケープシーケンスとして使用されます。したがって、「\\」は単純なバックスラッシュを渡し、次に「n」を入れます


0

まず第一に、私はそれが通常だと思います\r\n、第二に、それらはすべてのシステムで同じではありません。これはWindowsでのみ機能します。新しいラインを別のシステムで処理する方法が異なるため、新しいラインを置き換える方法を見つけようとするのはちょっと面倒です(ここを参照)。あなただけで幸運かもしれません\n


0

他の誰かがこれを試したがうまくいかなかった場合、これはあなたが私と同じ脳みそをしたかもしれないことを思い出させるものです。

最初にmysqlが文字列をエスケープしましたか?この場合、改行文字は改行文字ではなくなります。

私はそれを解析するのを避けるために何もせず、 '\ n'(実際の改行文字ではなく、文字通りのバックスラッシュとn)で改造して展開しました。


3
mysqlエスケープ後に文字列操作を実行しても、まったく意味がありません
常識

0

入力テキストボックスからの投稿から改行を失っていますか?
私にとって速く機能するのは、テキストまたはExcelまたはHTMLのテーブルタイプまたは改行タイプのデータをコピーして貼り付け、それをinputextboxではなくtextareaに貼り付けることです。これにより、POSTの改行がそのまま保持されます。

 <textarea  id="txtArea" name="txtArea" rows="40" cols="170"></textarea>
 <br>
 <input type="submit" value="split lines into array" /> 

受信ファイル形式:

 $txtArea ='';  
 $txtArea = $_POST['txtArea'];  
 $TA = $_POST['txtArea'];  
 $string = $TA;  
 $array = preg_split ('/$\R?^/m', $string); 
// or any of these: 
// $array = explode(PHP_EOL,$string);  
// $array = explode("\n", $txtArea); 
 echo "<br>A0: ".$array[0];
 echo "<br>A1: ".@$array[1];
 echo "<br>A2: ".@$array[2];

0

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

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

0

PHP_EOL 表向きはクロスプラットフォーム互換の方法で改行文字を見つけるために使用されるので、DOS / Unixの問題を処理します。

これを試して:

$myString = "Prepare yourself to be caught
You in the hood gettin' shot
We going throw hell of blows
got my whole frame froze";

$myArray = explode(PHP_EOL, $myString);

print_r($myArray);

0

あなたは正規表現でそれを試すことができます:

$skuList = explode('/[\r\n]+/', $_POST['skuList']);


0

ここに私のために働いたものがあります。PHP 5.6およびPHP 7.0でテスト済み:

    $skuList = str_replace("\\r\\n", "\n", $_POST['skuList']);
    $skuList = str_replace("\\n\\r", "\n", $skuList);

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