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 ";
James
sumber
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));
jwueller
sumber
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));
matsolof
sumber
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

NullUserException
sumber
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);
fabrik
sumber
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);
RobertPitt
sumber
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);
Peter
sumber
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 ''.

Tidak
sumber
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);
netom
sumber
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
sumber
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);
Md. Al Amin Bhuiyan
sumber
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 ...

GDY
sumber
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.

ekerner
sumber
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);
Rajeev
sumber
2

mungkin ini bekerja:

$str='\n';
echo str_replace('\n','',$str);
زياد
sumber
1

Yang ini juga menghapus tab

$string = preg_replace('~[\r\n\t]+~', '', $text);
pengguna3213174
sumber
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 );
PCMShaper
sumber
1

Banyak dari solusi ini tidak berhasil untuk saya. Ini berhasil meskipun: -

$svgxml = preg_replace("/(*BSR_ANYCRLF)\R/",'',$svgxml);

Berikut rujukannya: - PCRE dan Baris Baru

Adam Whateverson
sumber
0

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

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

sumber
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;
Ramesh
sumber