Bagaimana menghapus jeda baris (tanpa karakter!) Dari string?

146

Ini mungkin tampak seperti sebuah penipuan, tetapi yakinlah tidak - saya telah mencari SO dan juga seluruh web untuk jawaban atas masalah saya dan akhirnya menemukan "solusi" yang sama tidak cukup berulang-ulang. Bagaimanapun, ini dia:

Saya menyimpan input pengguna dari textarea ke database MySQL (dalam lingkungan WordPress, tapi itu tidak masalah bagi masalah ini, saya percaya). Ini kemudian diambil dari DB untuk ditampilkan ke Admin di backend situs. Masalah terjadi ketika pengguna mengirim teks dengan jeda baris (yaitu tekan tombol Enter).

Contoh string mungkin terlihat seperti ini:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!

Greetings,
Bill

Tidak ada karakter garis akhir ("\ n", "\ r", atau sejenisnya) dalam string.

Saya menggunakannya nl2br()untuk menghasilkan output HTML, tapi itu tidak cukup. Hasilnya kemudian adalah:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill

Yang, sejauh yang saya mengerti, adalah nl2br()hasil yang diharapkan , karena hal itu menyisipkan tag dan tidak seharusnya menggantikan jeda baris di tempat pertama?

Namun format yang saya butuhkan adalah sebagai berikut:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br /><br />Greetings,<br />Bill

Jika string memiliki karakter EOL seperti "\ n" di dalamnya, saya akan memukulnya dengan baik str_replace()atau preg_replace()selesai, tetapi saya tidak tahu jarum apa yang harus dimasukkan ke salah satu fungsi tersebut jika tidak ada karakter di sana. di tempat pertama.

Saya dapat secara manual mengakses bidang yang relevan di DB, tekan Backspace untuk setiap linebreak dan apa yang nanti saya ingin lakukan dengan string berfungsi. Jadi saya tahu saya perlu format di atas.

Johannes Pille
sumber
Jika string terlihat seperti contoh pertama Anda, lalu bagaimana Anda dapat mengatakan bahwa string tersebut tidak memiliki karakter pemisah baris di dalamnya? Setidaknya ada dua: dua berturut-turut setelah "terima kasih!"
Ernest Friedman-Hill
Adil enuff @ ErnestFriedman-Hill, Anda jelas benar - ada "sesuatu" di sana, hanya tidak terlihat tidak apa-apa yang saya tahu.
Johannes Pille
Saya juga tidak bisa melihat bagaimana mungkin untuk memiliki baris baru tanpa karakter line break. Bisakah Anda menggunakan hex editor untuk memeriksa string - Saya yakin Anda akan menemukan karakter untuk baris baru ...
jelatang

Jawaban:

376

Anda harus dapat menggantinya dengan preg yang menghapus semua baris baru dan carriage return. Kode tersebut adalah:

preg_replace( "/\r|\n/", "", $yourString );

Meskipun \nkarakter tidak muncul, jika Anda mendapatkan carriage return ada karakter yang tidak terlihat di sana. Pengganti preg harus mengambil dan memperbaikinya.

Ben Roux
sumber
Luar biasa. Saya bisa bersumpah telah mencoba segalanya sesuai dengan jawaban Anda dan jawaban @bsdnoobz, yang melakukan keduanya. Oh well, apa pun hambatan mental yang saya miliki di sana, Anda berdua menghemat banyak waktu. Ternyata itu pertanyaan yang sangat konyol, kurasa. Terima kasih kawan!
Johannes Pille
3
Perhatikan bahwa ini tidak akan cocok dengan semua jeda baris, yaitu yang dibuat pada sistem Windows. Untuk menangkap ini, Anda dapat menggunakan RegEx berikut/\r|\n|\r\n/
Toastrackenigma
6
gunakan \ R (yang mewakili urutan akhir baris) stackoverflow.com/a/16274784/1491212
Armel Larcier
435

Solusi Ben dapat diterima, tetapi str_replace () jauh lebih cepat daripada preg_replace ()

$buffer = str_replace(array("\r", "\n"), '', $buffer);

Menggunakan lebih sedikit daya CPU, mengurangi emisi karbon dioksida dunia.

Demis Palma ツ
sumber
5
Tidak percaya jawaban ini tidak mendapatkan lebih banyak kredibilitas. 100 jempol hingga ini lebih dari preg_replace ()
pimbrouwers
62
PENTING: Gunakan QUOTLE QUOTES di sekitar carriage-return dan kode baris baru. Ini tidak akan diproses dengan benar jika Anda menggunakan tanda kutip tunggal!
bwright
47
Jempol ke atas -> "Menggunakan lebih sedikit daya CPU, mengurangi emisi karbon dioksida dunia."
Jan
3
@ Joeri: Yang terakhir tidak akan pernah dipanggil karena akan ditangani oleh dua yang pertama. Itu kode yang berlebihan.
nightfox89
4
@Joeri Mempertimbangkan str_replace menghapus semua kejadian, bukankah \ r dan \ n keduanya SEMUA akan dihapus?
Bram Vanroy
16
$str = "
Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill";

echo str_replace(array("\n", "\r"), '', $str);  // echo $str in a single line
mengalir bebas
sumber
11

Itu karena nl2br()tidak menghapus baris baru sama sekali.

Pengembalian string dengan <br />atau <br> dimasukkan sebelum semua baris ( \r\n, \n\r, \ndan \r).

Gunakan str_replacesebaliknya:

$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
kenorb
sumber
7

Anda juga dapat menggunakan trim PHP

Fungsi ini mengembalikan string dengan spasi kosong dilucuti dari awal dan akhir str. Tanpa parameter kedua, trim () akan menghapus karakter ini:

  • "" (ASCII 32 (0x20)), ruang biasa.
  • "\ t" (ASCII 9 (0x09)), sebuah tab.
  • "\ n" (ASCII 10 (0x0A)), baris baru (umpan baris).
  • "\ r" (ASCII 13 (0x0D)), carriage return.
  • "\ 0" (ASCII 0 (0x00)), byte-NUL.
  • "\ x0B" (ASCII 11 (0x0B)), tab vertikal.
Gijs de Jong
sumber
3
Ini hanya akan menargetkan baris baru di awal dan akhir string. Baris baru di tengah string tidak akan tersentuh.
mickmackusa
6

Untuk bekerja dengan baik juga pada Windows saya sarankan untuk menggunakan

$buffer = str_replace(array("\r\n", "\r", "\n"), "", $buffer);

"\r\n"- untuk Windows, "\r"- untuk Mac dan "\n"- untuk Linux

Ajjaah
sumber
2
Maaf sobat, tetapi bahkan setelah bertanya pada '12, saya dapat memberi tahu Anda dengan pasti bahwa ini mubazir. Tanyakan pada diri Anda hal berikut: Jika semua \rdan \ndihapus dalam string, mengapa tidak demikian bagi mereka yang mengikuti satu sama lain secara langsung?
Johannes Pille
Sungguh, hal yang jelas ini belum terlintas di pikiran saya ... Terima kasih :) Saya baru menyadari bahwa saya memiliki masalah dengan itu, tetapi sebaliknya, saya menggunakan \r\nWindows dan tidak bekerja di Linux.
Ajjaah
Yah, saya menggunakan fungsi ini untuk mengganti jeda baris dengan koma sehingga alamat adalah teks baris tunggal, jadi mengganti \r\nPERTAMA akan membantu, karena itu berarti satu koma daripada dua untuk setiap bagian jika garis itu putus
Martin
@ Martin Ya, Anda benar, saya baru menyadari hal yang sama, jadi kami ganti \r\ndulu, lalu kami ganti \rdan \n, saya sudah mengedit jawaban saya.
Ajjaah
Ini masih berlebihan, jika Anda akan menghapus semua \rdan \r, tidak perlu menghapus \r\n, Anda dapat pengguna str_replace(array("\r","\n"), "", $buffer);untuk mendapatkan hasil yang sama.
stramin
6

str_replace (PHP_EOL, null, $ str);

Rafanake
sumber
1
sementara ini mungkin menjawab pertanyaan. Disarankan untuk menjelaskan sedikit tentang jawaban Anda.
Anirudh Sharma
PHP_EOL tidak selalu berfungsi saat Anda membaca string. Itu terjadi ketika Anda menulisnya.
nightfox89
Jawaban khusus kode hanya bernilai rendah di StackOverflow karena mereka sangat sedikit mendidik OP dan pembaca masa depan.
mickmackusa
4

Sesuatu yang sedikit lebih fungsional (mudah digunakan di mana saja):

function strip_carriage_returns($string)
{
    return str_replace(array("\n\r", "\n", "\r"), '', $string);
}

Menggunakan PHP_EOL sebagai parameter penggantian pencarian juga merupakan ide bagus! Pujian.

tfont
sumber
1

Alternatif bawaan: trim ()

trim  Strip whitespace (or other characters) from the beginning and end of a string
Description 
trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] ) : string

This function returns a string with whitespace stripped from the beginning and end of str.
Without the second parameter, trim() will strip these characters:

    " " (ASCII 32 (0x20)), an ordinary space.
    "\t" (ASCII 9 (0x09)), a tab.
    "\n" (ASCII 10 (0x0A)), a new line (line feed).
    "\r" (ASCII 13 (0x0D)), a carriage return.
    "\0" (ASCII 0 (0x00)), the NUL-byte.
    "\x0B" (ASCII 11 (0x0B)), a vertical tab.

Itu ada di sana untuk menghapus jeda baris dari berbagai jenis file teks, tetapi tidak menangani html.

NVRM
sumber
0

Saya menggunakan 3 baris untuk melakukan pekerjaan ini, jadi anggap $ s sebagai "barang" Anda ...

$s=str_replace(chr(10),'',$s);
$s=str_replace(chr(13),'',$s);
$s=str_replace("\r\n"),'',$s);
PYK
sumber