Hapus baris baru dari string dan ganti dengan satu ruang kosong


291
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

Ingin menghapus semua baris baru dari string.

Saya sudah regex ini, itu bisa menangkap mereka semua, masalahnya adalah saya tidak tahu dengan fungsi yang harus saya gunakan.

/\r\n|\r|\n/

$string harus menjadi:

$string = "put returns between paragraphs for linebreak add 2 spaces at end ";

1
Jika Anda melakukan ribuan penggantian, hindari penggunaan preg_replace. Ini hampir dua kali lebih lambat str_replace.
Alex W

Anda mungkin menemukan s($str)->normalizeLineEndings('')bermanfaat, seperti yang ditemukan di perpustakaan mandiri ini . Ini tidak hanya akan menghapus LF, CR dan CRLF, tetapi juga setiap baris baru Unicode.
gak

Jawaban:


578

Anda harus berhati-hati terhadap jeda baris ganda, yang akan menyebabkan spasi ganda. Gunakan ungkapan reguler yang sangat efisien ini:

$string = trim(preg_replace('/\s\s+/', ' ', $string));

Beberapa spasi dan baris baru diganti dengan satu ruang.

Sunting: Seperti yang telah ditunjukkan orang lain, solusi ini memiliki masalah pencocokan satu baris baru di antara kata-kata. Ini tidak ada dalam contoh, tetapi orang dapat dengan mudah melihat bagaimana situasi itu bisa terjadi. Alternatifnya adalah dengan melakukan hal berikut:

$string = trim(preg_replace('/\s+/', ' ', $string));

10
Sebelum Anda menggunakan solusi ini, lihat jawaban saya di bawah dan komentar untuk jawaban saya. Solusi ini mungkin tidak berfungsi seperti yang Anda harapkan.
matsolof

1
dalam ekspresi reguler "Cocokkan karakter spasi putih", mengapa itu cocok dengan baris baru?
Michael Z

2
Saya sedang mencari solusi untuk menghapus / mengganti semua spasi putih tetapi tidak ruang (ganda). Ini adalah regex yang melakukannya:/(?![ ])\s+/
algoritme

Hanya ingin memberi tahu Anda bahwa solusi Anda telah menghemat banyak waktu bagi saya.
Parthapratim Neog

183

Beberapa komentar tentang jawaban yang diterima:

The +berarti "1 atau lebih". Saya pikir Anda tidak perlu mengulanginya \s. Saya pikir Anda bisa menulis '/\s+/'.

Juga, jika Anda ingin menghapus spasi putih terlebih dahulu dan terakhir dalam string, tambahkan trim.

Dengan modifikasi ini, kodenya adalah:

$string = preg_replace('/\s+/', ' ', trim($string));

Kamu benar; /\s\s+/akan gagal mencocokkan linefeed in foo\nbar.
Alan Moore

79

Gunakan saja preg_replace()

$string = preg_replace('~[\r\n]+~', '', $string);

Anda bisa lolos dengan str_replace()yang satu ini, meskipun kode tidak terlihat bersih:

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

Lihat langsung di ideone


1
OP menginginkan ruang antara "paragraf" dan "untuk". Jika Anda hanya menghapus karakter baris baru, tidak akan ada satu.
Daniel Vandersluis

tolong perbaiki itu untuk$string = preg_replace("~[\r\n]~", "",$string);
erikbwork

Kalau tidak, tidak ada lagi yang bisa dikatakan. itu jawaban yang paling sederhana, saya pikir!
erikbwork

3
@ erik Lalu aku akan "salah". Ini berfungsi dengan baik apa adanya.
NullUserException

1
@Vineet Ini hanya pembatas yang menunjukkan awal dan akhir regex
NullUserException

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

3
Escape sequence dalam PHP perlu dikutip ganda.
Daniel Vandersluis

Ini tidak melakukan persis apa yang diinginkan OP, karena ini sama dengan jawaban yang sulit dipahami dan itu tidak menghilangkan \rkarakter
NullUserException

@NullUser: Mengapa Anda tidak memperbarui posting Anda sendiri daripada mengomentari ini?
fabrik

@NullUser: Kecuali fakta itu menggantikan semuanya dengan '' bukan ''.
fabrik

12

Anda harus menggunakan str_replace untuk kecepatannya dan menggunakan tanda kutip ganda dengan sebuah array

str_replace(array("\r\n","\r"),"",$string);

Sumber daya rendah, sempurna, tks.
CONvid19

1
Saya mungkin salah tetapi kode ini tidak menghapus baris baru char pada sistem Unix karena pada sistem itu baris baru adil \ndan tidak \r\nlagi saya pikir OP meminta untuk menempatkan satu spasi di tempat baris baru
Marco Demaio

7

Saya tidak yakin apakah ini memiliki nilai terhadap jawaban yang sudah dikirimkan tetapi saya juga bisa mempostingnya.

// Create an array with the values you want to replace
$searches = array("\r", "\n", "\r\n");

// Replace the line breaks with a space
$string = str_replace($searches, " ", $string);

// Replace multiple spaces with one
$output = preg_replace('!\s+!', ' ', $string);

6

Penggantian regre PCRE dapat dilakukan dengan menggunakan preg_replace: http://php.net/manual/en/function.preg-replace.php

$new_string = preg_replace("/\r\n|\r|\n/", ' ', $old_string);

Akan mengganti baris baru atau mengembalikan karakter dengan spasi. Jika Anda tidak ingin apa pun menggantikannya, ubah argumen ke-2 menjadi ''.


1
The pregfungsi menggunakan PCRE, tidak POSIX, ekspresi reguler. Ada beberapa eregfungsi yang menggunakan POSIX, tetapi sekarang sudah tidak digunakan lagi.
Daniel Vandersluis

5

Gunakan ini:

ganti serangkaian baris baru dengan string kosong:

$string = preg_replace("/[\\n\\r]+/", "", $string);

atau Anda mungkin ingin mengganti baris baru dengan satu ruang:

$string = preg_replace("/[\\n\\r]+/", " ", $string);

Harap format kode Anda dengan benar. Ini dilakukan dengan membuat indentasi garis yang relevan dengan empat ruang.
jwueller

2
Itu sebabnya saya menggunakan tanda kutip tunggal jadi saya tidak perlu melarikan diri dari karakter tersebut. \\nterlihat mengerikan. \\\\ mencocokkan backslash tunggal hanya mengerikan.
NullUserException

5

Urutan melarikan diri\R cocok dengan baris umum generik

yaitu, apa pun yang dianggap sebagai urutan linebreak oleh Unicode. Ini termasuk semua karakter yang cocok dengan \v( spasi vertikal ), dan urutan multi karakter \x0D\x0A...

$string = preg_replace('/\R+/', " ", $string);

Dalam mode non-UTF-8 8-bit \Rsetara dengan yang berikut: (?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

Demo Regex101


Anton tolong periksa, apakah edit saya ok! Menambahkan beberapa informasi lebih lanjut.
gelembung bobble

4

Istirahat baris dalam teks umumnya direpresentasikan sebagai:

\ r \ n - di komputer windows

\ r - di komputer Apple

\ n - di Linux

//Removes all 3 types of line breaks

$string = str_replace("\r", "", $string);

$string = str_replace("\n", "", $string);

3

Apa tentang:

$string = trim( str_replace( PHP_EOL, ' ', $string ) );

Ini harus menjadi solusi yang cukup kuat karena \ n tidak bekerja dengan benar di semua sistem jika saya tidak salah ...


Ini sepertinya tidak menggantikan \ r tetapi hanya \ n: ideone.com/28KPcb
T30

Seperti disebutkan dalam manual PHP_EOL berisi simbol 'End Of Line' yang benar untuk platform saat ini. Jika Anda mengimpor string dari platform lain atau Anda hanya memiliki string yang diformat dengan buruk, ini dapat rusak.
GDY

Jika Anda memiliki lingkungan yang cukup tertutup ini sepertinya solusi yang paling elegan bagi saya karena platformnya independen dan mungkin cukup berkinerja ... jika Anda memiliki input yang lebih luas seperti skenario impor / ekspor, Anda mungkin harus menggunakan solusi regex.
GDY

3

Saya terkejut melihat betapa sedikit yang diketahui semua orang tentang regex.

Strip baris baru dalam php adalah

$str = preg_replace('/\r?\n$/', ' ', $str);

Dalam perl

$str =~ s/\r?\n$/ /g;

Berarti ganti karakter baris baru di akhir baris (untuk efisiensi) - opsional didahului dengan carriage return - dengan spasi.

\ n atau \ 015 adalah baris baru. \ r atau \ 012 adalah carriage return. ? di regex berarti kecocokan 1 atau nol dari karakter sebelumnya. $ in regex berarti cocok dengan garis akhir.

Referensi regex asli dan terbaik adalah perldoc perlre, setiap pembuat kode harus mengenal dokumen ini dengan baik: http://perldoc.perl.org/perlre.html Catatan tidak semua fitur didukung oleh semua bahasa.


Solusi ini tidak berfungsi untuk saya tetapi seperti yang disebutkan, saya perlu membaca lebih banyak untuk menghasilkan solusi yang sebenarnya. Saya terkejut ini tidak berhasil.
Adam Whateverson

2

ini adalah pola yang akan saya gunakan

$string = preg_replace('@[\s]{2,}@',' ',$string);

2

mungkin ini bekerja:

$str='\n';
echo str_replace('\n','',$str);


1

Anda dapat mencoba kode di bawah ini untuk mempertahankan spasi putih dan baris baru dalam teks Anda.

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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


0

kode di bawah ini berfungsi untuk semua teks, silakan gunakan:

$des = str_replace('\n',' ',$des);
$des = str_replace('\r',' ',$des);

0

Anda dapat menghapus garis baru dan beberapa spasi putih.

$pattern = '~[\r\n\s?]+~';
$name="test1 /
                     test1";
$name = preg_replace( $pattern, "$1 $2",$name);

echo $name;
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.