Meledakkan string PHP dengan baris baru

253

Sederhana bukan? Nah, ini tidak berfungsi: - \

$skuList = explode('\n\r', $_POST['skuList']);
Webnet
sumber
28
Kutipan tunggal berarti "jangan uraikan string ini". @ Jawaban Select0r mungkin adalah yang Anda cari.
Ryan Kinal
3
mungkin duplikat cara menghapus baris baru dan kembali dari string php? yang sudah merupakan duplikat Andal menghapus newsline dari string dan beberapa lainnya . Silakan gunakan fungsi pencarian sialan sebelum mengajukan pertanyaan!
Gordon
1
@ Gordon: Ha, saya melihat apa yang Kolonel Shrapnel katakan dalam pertanyaan lain itu. Agak sedih sebenarnya. Menambahkan suara dekat saya.
BoltClock
9
Selain kutipan tunggal yang dikeluarkan oleh orang lain, pasangan CRLF \r\ntidak sebaliknya.
Powerlord
1
Cobalah untuk mengingat bahwa: \ R etur \ N
l00k

Jawaban:

410

Praktek terbaik

Seperti disebutkan dalam komentar pada jawaban pertama, praktik terbaik adalah dengan menggunakan konstanta PHP PHP_EOL yang mewakili EOL sistem saat ini ( End Of Line ).

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

PHP menyediakan banyak konstanta lain yang sangat berguna yang dapat Anda gunakan untuk membuat sistem kode Anda independen, lihat tautan ini untuk menemukan konstanta direktori yang berguna dan independen sistem.

Peringatan

Konstanta ini membuat sistem halaman Anda independen, tetapi Anda mungkin mengalami masalah ketika berpindah dari satu sistem ke sistem lainnya ketika Anda menggunakan konstanta dengan data yang disimpan di sistem lain. Konstanta sistem baru mungkin berbeda dari sistem sebelumnya dan data yang disimpan mungkin tidak berfungsi lagi. Jadi parsing data Anda sepenuhnya sebelum menyimpannya untuk menghapus bagian-bagian yang bergantung pada sistem.

MEMPERBARUI

Komentar Andreas membuat saya menyadari bahwa solusi 'Praktik Terbaik' yang saya sajikan di sini tidak berlaku untuk kasus penggunaan yang dijelaskan: EOL server (PHP) tidak ada hubungannya dengan EOL yang digunakan browser (OS apa pun), tapi itu (browser) adalah asal dari string.

Jadi, silakan gunakan solusi dari @Alin_Purcaru ( three down ) untuk mencakup semua pangkalan Anda (dan pilih jawabannya):

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);
Larzan
sumber
5
Ini adalah jawaban baru tetapi mungkin jawaban yang terbaik dan benar diterima
frazras
Itu aneh, karena ini adalah cara PHP ingin Anda melakukannya :) Dapatkah Anda memberi saya lebih banyak detail tentang OS dan versi PHP Anda, mungkin sepotong kode pada PasteBin atau sth. serupa?
Larzan
16
Anda tidak dapat menggunakan PHP_EOL karena sistem dan sumber input tidak ada hubungannya satu sama lain. Jika pengguna meletakkan baris baru di Windows dan PHP berjalan di Linux hasilnya mungkin rusak.
barell
1
@ Barell persis, itulah situasi yang saya jelaskan di bagian 'peringatan';) Pertanyaannya tidak secara eksplisit menyatakan bahwa itu adalah input lama yang disimpan dalam database. Silakan baca bagian 'peringatan' dan Anda akan melihat bahwa saya membahas situasi itu di sana.
Larzan
7
Jawaban ini salah untuk kasus penggunaan ini. Jangan gunakan konstanta PHP_EOL dalam hal ini karena sumber input (mis. Browser pengguna) jelas bukan sistem Anda. Gunakan solusi yang menangani semua akhiran garis yang berbeda (jawaban dari Alin Purcaru).
Andreas
241

Tutupi semua case. Jangan mengandalkan bahwa input Anda berasal dari lingkungan Windows.

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

atau

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);
Alin Purcaru
sumber
21
Ini akan menghasilkan elemen array kosong jika eol adalah \r\n. Untuk mencegah hal itu, baik menggunakan: preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);(catatan bahwa \r\nmenjadi tidak perlu bila menggunakan bendera itu) atau hanya menempatkan \r\n sebelum itu \r:preg_split('/\r\n|\n|\r/', $_POST['skuList']);
webbiedave
2
@webbiedave PREG_SPLIT_NO_EMPTY bagus, TETAPI itu akan menghapus baris kosong. Ini mungkin atau mungkin tidak diinginkan.
Jms
Pola ini akan cocok dengan setiap huruf untuk saya, karena itu menghasilkan kesuksesan bahkan jika tidak ada. "?" berarti 0 atau satu kali, sehingga dimungkinkan untuk mencocokkan bahkan jika keduanya \ r dan \ n tidak ada. Anda mengatakan "diperbaiki" tetapi saya tidak melihat itu. Saya menggunakan / (\ r | \ n) + / sebagai gantinya.
Rolf
1
@Rolf Sepertinya saya mengedit dengan tergesa-gesa. Diperbaiki sekarang. Apa yang harus Anda gunakan tergantung pada apakah Anda ingin baris kosong atau tidak dalam output. Pilihan dari jawaban saya juga mengembalikan baris kosong.
Alin Purcaru
3
@AlinPurcaru Bisakah Anda mengklarifikasi dalam jawaban mana (keduanya, keduanya, tidak?) Akan menghasilkan kosong dan mana yang tidak?
Patrick
150

Coba "\n\r"(tanda kutip ganda) atau adil "\n".

Jika Anda tidak yakin jenis EOL yang Anda miliki, jalankan str_replace sebelum meledak, ganti "\ n \ r" dengan "\ n".

Select0r
sumber
52
Kutipan tunggal dalam PHP berarti "jangan uraikan string ini". Itu berarti karakter kontrol Anda tidak diuraikan, mereka dianggap sebagai literal (bukan garis istirahat dan carriage return, tetapi sebenarnya, literal '\ n \ r'). Menggunakan tanda kutip ganda berarti "menguraikan string ini", dan dengan demikian karakter kontrol Anda akan diuraikan. +1
Ryan Kinal
17
/n/r? Saya tahu OP menulis itu tetapi windows eol yang benar adalah\r\n
webbiedave
20
Pertimbangkan PHP akhir baris konstan: PHP_EOL.
Daniel W.
Hai semuanya, ini jelas jawaban yang tepat! Saya bertanya-tanya mengapa jawaban @Alin Purcaru mendapat 44 suara .. Itu salah !!! Ini tidak selalu berfungsi dengan benar walaupun tampaknya itu berfungsi dengan baik .. Jadi, inilah komentar saya untuk siapa pun yang melakukan hal yang sama
Rafik Bari
3
Abaikan saja, OS terakhir yang menggunakannya tanpa \ n adalah OS9 ( en.wikipedia.org/wiki/Newline#Representations ). Karenanya ini akan memberi Anda hasil terbaik:explode("\n", str_replace("\r", '', $string));
DanielM
15

Banyak hal di sini:

  • Anda perlu menggunakan tanda kutip ganda, bukan tanda kutip tunggal, jika karakter yang lolos tidak akan lolos.
  • Urutan normal adalah \r\n, bukan \n\r.
  • Bergantung pada sumbernya, Anda mungkin mendapatkan \ntanpa \r(atau bahkan dalam kasus yang tidak biasa, mungkin hanya \r)

Mengingat poin terakhir, Anda mungkin menemukan preg_split()menggunakan semua varian yang mungkin akan memberi Anda cara yang lebih dapat diandalkan untuk memisahkan data daripada explode(). Tapi Anda juga bisa menggunakan explode()dengan adil \n, dan kemudian gunakan trim()untuk menghapus \rkarakter apa pun yang tertinggal.

Spudley
sumber
Jawaban yang bagus Ringkas, mencakup semuanya. Terima kasih!
Kosta Kontos
11

fungsi php ini meledak string oleh baris baru

Perhatian : baris baru di Windows adalah \ r \ n dan di Linux dan Unix adalah \ n
fungsi ini mengubah semua baris baru ke mode linux kemudian membaginya.
perhatikan bahwa baris kosong akan diabaikan

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

contoh

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

keluaran

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

mencoba

explode(chr(10), $_POST['skuList']);
Oberdan
sumber
6

Untuk jalur baru, hanya saja

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

Untuk baris baru dan carriage return (seperti dalam file Windows), itu seperti yang Anda posting. Apakah skuList Anda merupakan area teks?

Andrew Sledge
sumber
4

Tempatkan \ntanda kutip ganda:

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

Dalam tanda kutip tunggal, jika saya tidak salah, ini diperlakukan sebagai \dan nsecara terpisah.

Russell Dias
sumber
3

Sudahkah Anda mencoba menggunakan tanda kutip ganda?

piddl0r
sumber
3

Tidak sempurna tetapi saya pikir itu pasti yang paling aman. Tambahkan nl2br :

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

Coba ini:

explode(PHP_EOF, $lines);
pengguna3762492
sumber
3
Tentunya PHP_EOL daripada EOF
Ewen
1

Semudah kelihatannya

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

Anda hanya perlu memberikan teks yang tepat "\ n" dan menulis \ n secara langsung digunakan sebagai Escape Sequence. Jadi "\\" untuk melewati garis miring sederhana dan kemudian meletakkan "n"

Utsav Barnwal
sumber
0

Pertama-tama, saya pikir biasanya \r\n, yang kedua, itu tidak sama pada semua sistem. Itu hanya akan bekerja di windows. Agak menyebalkan mencoba mencari cara mengganti saluran baru karena sistem yang berbeda memperlakukannya secara berbeda (lihat di sini ). Anda mungkin lebih beruntung dengan adil \n.

Richard Marskell - Drackir
sumber
0

Jika orang lain mencoba ini tetapi tidak berhasil, ini adalah pengingat bahwa Anda mungkin telah melakukan kentut otak yang sama dengan saya.

Apakah Anda mysql lolos dari string pertama? Dalam hal ini karakter baris baru tidak lagi menjadi karakter baris baru.

Saya tidak melakukan apa pun untuk menghindari menguraikannya, hanya diadaptasi dan meledak oleh '\ n' (secara harfiah garis miring terbalik dan n daripada karakter baris baru yang sebenarnya.

pengguna37150
sumber
3
melakukan manipulasi string apa pun setelah pelarian mysql sama sekali tidak masuk akal
Your Common Sense
0

Kehilangan jeda dari posting dari kotak teks input?
Apa yang bekerja lebih cepat bagi saya adalah menyalin rekatkan teks atau Excel atau jenis tabel HTML atau tipe baris baru data dan rekatkan ke dalam textarea alih-alih inputextbox: ini menjaga linebreaks tetap utuh dalam POST.

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

dalam bentuk menerima file:

 $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];
KarlosFontana
sumber
0

Metode ini selalu berhasil untuk saya:

$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'])));

sumber
0

PHP_EOL seolah-olah digunakan untuk menemukan karakter baris baru dengan cara yang kompatibel lintas platform, sehingga menangani masalah DOS / Unix.

Coba ini:

$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);
Radosav Leovac
sumber
0

Anda dapat mencobanya dengan regex:

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

Tarol
sumber
0

Inilah yang bekerja untuk saya. Diuji dalam PHP 5.6 dan juga 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);
codemonkey
sumber