Bagaimana saya bisa meletakkan string dalam array, dibagi dengan baris baru?


220

Saya memiliki string dengan jeda baris di database saya. Saya ingin mengubah string itu menjadi sebuah array, dan untuk setiap baris baru, lompat satu tempat indeks dalam array.

Jika stringnya adalah:

My text1
My text2
My text3

Hasil yang saya inginkan adalah ini:

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

1
Saya tidak tahu PHP tetapi biasanya ada fungsi yang disebut "split" untuk string. Ini bekerja seperti ini: array = split (string, "\ n")
Sedat Kapanoglu

Anda harus menormalkan baris baru terlebih dahulu, mungkin. Metode s($yourString)->normalizeLineEndings()ini tersedia dengan github.com/delight-im/PHP-Str (perpustakaan di bawah Lisensi MIT) yang memiliki banyak pembantu string berguna lainnya. Anda mungkin ingin melihat kode sumbernya.
gak

Jawaban:


290

Anda dapat menggunakan explodefungsi ini, menggunakan " \n" sebagai pemisah:

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

Misalnya, jika Anda memiliki kode ini:

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

Anda akan mendapatkan hasil ini:

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


Perhatikan bahwa Anda harus menggunakan string yang dikutip ganda , sehingga \nsebenarnya ditafsirkan sebagai garis-istirahat.
(Lihat halaman manual itu untuk lebih jelasnya.)


52
Alih-alih \nAnda dapat menggunakan konstanta yang telah ditentukan PHP_EOL.
Tim

40
Semua orang harap berhati-hati dengan solusi ini, karena ini tidak bekerja pada semua baris baru. Saya paling sukses dengan jawaban David
Maurice

1
Anda harus berpisah pada \ n atau \ r untuk dapat menangani semua jenis teks - ini hanya akan bekerja dengan linux & windows newlines. Baris baru Mac akan diabaikan! (r)
Steve Horvath

1
Saya kira jawaban Tim / komentar tidak benar, karena ini hanya akan cocok dengan linebreak sistem ANDA, tetapi ketika Anda mendapatkan string yang memiliki linebreak dari sistem lain itu tidak akan berfungsi! Punya masalah ini dengan email
Asara

7
Tidak jawaban ini dan komentar pada jawaban ini SALAH! Karena ini bukan faktor karakter OS baris baru, terutama tidak PHP_EOL. Anda harus menggunakan preg_split("/\\r\\n|\\r|\\n/", $value).
kjdion84

330

Saya selalu menggunakan ini dengan sangat sukses:

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

(diperbarui dengan final, terima kasih @OBsterMan)


11
Jawaban ini harus di atas, bukan di Pascal. Yang itu tidak berfungsi untuk semua kasus.!
Jithesh Kt

1
Ini jawabannya. Yang divalidasi SALAH. Baiklah, hesselbom memilikinya juga ... Anda juga dapat menggunakan ini yang setara: preg_split ('/ \ n | \ r /', $ string, -1, PREG_SPLIT_NO_EMPTY); demi kecantikan :) Mengapa ini satu-satunya jawaban yang bagus? Karena Anda tidak dapat mengasumsikan jenis end of line apa yang akan Anda dapatkan: Mac (\ r), Windows (\ r \ n), atau Unix (\ n).
Ninj

2
\R cocok \n , \rdan\r\n
mpen

1
Atau lebih pendek /\r?\n/
Jason Schilling

Contoh ini benar karena Anda tidak bisa hanya mengambil operasi split yang hanya didasarkan pada satu karakter. Jika Anda melakukan itu, memicu pada '\ r' atau '\ n' Anda akan berakhir dengan baris kosong berlebihan jika akhiran Windows "\ r \ n". Dan penting bahwa pemisah Windows dua karakter diuji terlebih dahulu.
AndresRohrAtlasInformatik

281

Jeda baris didefinisikan secara berbeda pada platform yang berbeda, \ r \ n, \ r atau \ n.

Menggunakan RegExp untuk membagi string yang bisa Anda cocokkan ketiganya dengan \ R

Jadi untuk masalah Anda:

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

Itu akan cocok dengan jeda baris pada Windows, Mac dan Linux!


3
Saya menggunakan ini juga bukan jawaban yang diterima dan jawaban lain di utas ini. Meninggalkan komentar ini sebagai informasi.
Seth Malaki

3
Sebenarnya, ini tidak berhasil untuk saya. Terkadang baris baru masih ada di tombol array.
Maurice


32
Cukup gunakan$array = preg_split ('/\R/', $string);
Jan Goyvaerts

18
Kadang tidak bekerja! preg_split("/\r\n|\n|\r/", $string)pilihan yang lebih baik
Alexey B.

34

PHP sudah mengetahui karakter baris baru sistem saat ini. Cukup gunakan konstanta EOL.

explode(PHP_EOL,$string)

18
Ya, tetapi seseorang dapat mengedit file atau seperti dalam contoh ini entri db di Windows kemudian menggunakannya pada sistem Linux, misalnya. Saya pikir pendekatan umum akan lebih cocok.
Cranio

Saya tidak yakin ini benar. Jika area teks pada halaman web dikirimkan, itu mungkin memiliki karakter end-of-line yang berbeda tergantung pada browser pengguna, bukan sistem operasi server. Jadi, apa pun OS yang Anda gunakan, Anda harus dapat menguraikan apa pun. Ini dengan asumsi Anda melakukan hal-hal web tentu saja.
Magmatik

Anda mungkin harus menggunakan trim()string yang dihasilkan untuk menghapus spasi kosong yang tidak ada.
Tim

30

Alternatif jawaban Davids yang lebih cepat (lebih cepat) adalah dengan menggunakan str_replacedan explode.

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

Apa yang terjadi adalah:
Karena jeda baris dapat datang dalam bentuk yang berbeda, saya str_replace\ r \ n, \ n \ r, dan \ r dengan \ n sebagai gantinya (dan aslinya \ n dipertahankan).
Kemudian meledak\n dan Anda memiliki semua baris dalam sebuah array.

Saya melakukan patokan pada src halaman ini dan membagi garis 1000 kali dalam for for loop dan:
preg_replacemengambil rata-rata 11 detik
str_replace & explodemengambil rata-rata sekitar 1 detik

Lebih detail dan info bencmark di forum saya


Tautan forum Anda (dan seluruh domain) tampaknya turun
Nikita 웃

19

David: Arah yang bagus, tetapi Anda melewatkannya. ini bekerja untuk saya:

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

11

Anda tidak perlu fungsi preg_ * atau pola preg atau str_replace di dalam, dll. Untuk berhasil memecah string menjadi array oleh baris baru. Dalam semua skenario, baik itu Linux / Mac atau m $, ini akan dilakukan.

<?php 

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

?>

PHP_EOL adalah konstanta yang menahan karakter pemecah baris yang digunakan oleh platform server.


3
file dapat berasal dari sistem lain dengan baris baru yang berbeda, khususnya dalam lingkungan bersih untuk yang digunakan PHP
Luca C.

Itulah alasan konstan ini ada .. dan menangani masalah khusus itu.
Spooky

jika Anda mengambil file dari windows tidak cocok sama dengan file dari unix, atau mac, kan?
Luca C.

Jika Anda menggunakan utf-8 murni sepanjang waktu, di mana saja, file utf8 disertakan, secara normal, dan Anda tidak memiliki apa pun selain PHP_EOL di dalam kode Anda untuk deteksi jeda baris, itu akan dicocokkan seperti yang dijelaskan, dan tidak ada perilaku tak terduga yang akan terjadi. Ingatlah bahwa bukan hanya saya yang berteriak dan mengklaim ini. Kegunaan PHP_EOL cukup dikonfirmasi.
Spooky

1
Dalam kasus Anda, jika sumber berasal dari tempat lain dan tidak terbentuk dengan baik, apa pun, mungkin lebih baik jika Anda menggunakan str_replace (lebih cepat daripada regexp). ... semuanya, baik itu regexp. atau str_replace atau PHP_EOL, ada satu kalimat lama yang bagus yang mengatakan: "Jika berhasil - jangan disentuh!". :)
Spooky

9
explode("\n", $str);

The "(bukannya ') cukup penting karena jika tidak, baris istirahat tidak akan ditafsirkan.


9

StackOverflow tidak akan memungkinkan saya untuk mengomentari jawaban hesselbom (tidak cukup reputasi), jadi saya menambahkan sendiri ...

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

Ini bekerja paling baik untuk saya karena juga menghilangkan spasi putih depan (kedua) dan trailing (pertama) secara otomatis dan juga melompati garis kosong (bendera PREG_SPLIT_NO_EMPTY).

- = PILIHAN = -

Jika Anda ingin tetap memimpin spasi putih, cukup singkirkan yang kedua * dan buatlah rtrim () sebagai gantinya ...

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

Jika Anda perlu menjaga baris kosong, singkirkan bendera NULL (itu hanya placeholder) dan PREG_SPLIT_NO_EMPTY, seperti begitu ...

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

Atau menjaga spasi putih dan baris kosong ...

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

Saya tidak melihat alasan mengapa Anda ingin tetap mengikuti spasi, jadi saya sarankan untuk meninggalkan yang pertama di sana. Tapi, jika semua yang Anda inginkan adalah untuk dibagi dengan baris baru (seperti judulnya), ini sederhana (seperti yang disebutkan oleh Jan Goyvaerts) ...

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

The mpengubah tidak benar-benar diperlukan itu? Bukankah itu hanya mempengaruhi ^dan $?
mpen

@ buka Ya, saya yakin Anda benar. Saya hanya membawanya bersama dengan versi hesselbom. Saya akan mengedit posting saya.
Deen Foxx

7
<anti-answer>

Seperti jawaban lain yang telah ditentukan, pastikan untuk menggunakan explodedaripada splitkarena PHP 5.3.0 splitsudah usang. yaitu yang berikut ini BUKAN cara Anda ingin melakukannya:

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

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

</anti-answer>

3

Bagi siapa pun yang mencoba menampilkan cronjobs di crontab dan merasa frustrasi tentang cara memisahkan setiap baris, gunakan explode:

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

menggunakan '\ n' tampaknya tidak berfungsi tetapi chr (10) berfungsi dengan baik: D

Semoga ini menyelamatkan seseorang sakit kepala.


Hai Jeff, selamat datang di SO. Anda harus menulis ulang ini sebagai pertanyaan dan jawaban, bukan jawaban atas pertanyaan orang lain. Ini adalah situs tanya jawab, bukan forum umum. Lihat FAQ - stackoverflow.com/faq
Rebecca Scott

Menggunakan '\n'tidak berfungsi karena urutan pelarian tidak ditafsirkan dalam tanda kutip tunggal, Anda harus menggunakan tanda kutip ganda sebagai gantinya: "\n"alih-alih 'n'Baca php.net/manual/en/language.types.string.php
Christopher K.


2

Anda dapat melakukan $ string = nl2br ($ string) sehingga baris Anda diubah

<br />. 

Dengan cara ini tidak masalah jika sistem menggunakan \ r \ n atau \ n atau \ r

Kemudian Anda bisa memasukkannya ke dalam array:

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

Catatan: nl2br tidak menggantikan jeda baris ... itu hanya menyisipkan tag istirahat sebelum setiap jeda baris. Jadi semua item array Anda selain yang pertama akan dimulai dengan jeda baris. Jika itu tidak masalah bagi Anda, maka metode ini adalah yang tercepat. Jika itu penting, jawaban Jakar adalah yang tercepat.
Aust

2

Itulah cara saya:

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

Ini juga akan melewati semua baris kosong juga.


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";
}

array yang benar:

$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

Sematkan Online:

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


Tambahkan beberapa penjelasan dengan jawaban untuk bagaimana jawaban ini membantu OP dalam memperbaiki masalah saat ini
ρяσѕρєя K

1

Ambil ini di dokumen 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

Metode ini selalu berhasil untuk saya:

$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
Suka bersumpah sebagai bagian dari kode. :) Bagaimanapun, mengganti dengan \ n lebih sederhana dan lebih aman (lihat jawaban lain).
Stefan Reich

0

Menggunakan hanya paket 'base' juga merupakan solusi untuk kasus-kasus sederhana:

> 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

Menggunakan karakter khusus apa pun antara string atau baris \ndengan menggunakan PHP explode kita dapat mencapai ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.