@ 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):
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.
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\nsebelum 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".
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.
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
)
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"
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.
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.
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.
<textareaid="txtArea"name="txtArea"rows="40"cols="170"></textarea><br><inputtype="submit"value="split lines into array"/>
$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'])));
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);
\r\n
tidak sebaliknya.Jawaban:
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 ).
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):
sumber
Tutupi semua case. Jangan mengandalkan bahwa input Anda berasal dari lingkungan Windows.
atau
sumber
\r\n
. Untuk mencegah hal itu, baik menggunakan:preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);
(catatan bahwa\r\n
menjadi tidak perlu bila menggunakan bendera itu) atau hanya menempatkan\r\n
sebelum itu\r
:preg_split('/\r\n|\n|\r/', $_POST['skuList']);
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".
sumber
/n/r
? Saya tahu OP menulis itu tetapi windows eol yang benar adalah\r\n
PHP_EOL
.explode("\n", str_replace("\r", '', $string));
Banyak hal di sini:
\r\n
, bukan\n\r
.\n
tanpa\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 daripadaexplode()
. Tapi Anda juga bisa menggunakanexplode()
dengan adil\n
, dan kemudian gunakantrim()
untuk menghapus\r
karakter apa pun yang tertinggal.sumber
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
contoh
keluaran
sumber
mencoba
sumber
Untuk jalur baru, hanya saja
Untuk baris baru dan carriage return (seperti dalam file Windows), itu seperti yang Anda posting. Apakah skuList Anda merupakan area teks?
sumber
Tempatkan
\n
tanda kutip ganda:explode("\n", $_POST['skuList']);
Dalam tanda kutip tunggal, jika saya tidak salah, ini diperlakukan sebagai
\
dann
secara terpisah.sumber
Sudahkah Anda mencoba menggunakan tanda kutip ganda?
sumber
Tidak sempurna tetapi saya pikir itu pasti yang paling aman. Tambahkan nl2br :
sumber
Coba ini:
sumber
Semudah kelihatannya
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"
sumber
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
.sumber
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.
sumber
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.
dalam bentuk menerima file:
sumber
Metode ini selalu berhasil untuk saya:
sumber
Coba ini:
sumber
Anda dapat mencobanya dengan regex:
$skuList = explode('/[\r\n]+/', $_POST['skuList']);
sumber
Inilah yang bekerja untuk saya. Diuji dalam PHP 5.6 dan juga PHP 7.0:
sumber