Dizeden yeni satırları kaldırın ve bir boşlukla değiştirin


291
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

Tüm yeni satırları dizeden kaldırmak istiyorum.

Bu normal ifadeyi aldım, hepsini yakalayabilir, sorun şu ki hangi işlevi kullanmalıyım bilmiyorum.

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

$string olmalı:

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

1
Binlerce değişiklik yapıyorsanız, kullanmaktan kaçının preg_replace. Neredeyse iki kat daha yavaş str_replace.
Alex W

Bu bağımsız kitaplıktas($str)->normalizeLineEndings('') bulunan yardımcı olabilir . Sadece LF, CR ve CRLF'yi değil, aynı zamanda herhangi bir Unicode yeni satırını da kaldıracaktır.
caw

Yanıtlar:


578

Çift boşluklara neden olacak çift satır sonları konusunda dikkatli olmalısınız. Bu gerçekten etkili düzenli ifadeyi kullanın:

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

Birden çok boşluk ve satırsonu tek bir boşlukla değiştirilir.

Düzenleme: Diğerleri belirttiği gibi, bu çözüm kelimeler arasında tek satırsonu eşleşen sorunları var. Bu örnekte mevcut değildir, ancak bu durumun nasıl ortaya çıkabileceğini kolayca görebilirsiniz. Bir alternatif aşağıdakileri yapmaktır:

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

10
Bu çözümü kullanmadan önce aşağıdaki cevabım ve cevabımın yorumlarına bakınız. Bu çözüm beklediğiniz gibi çalışmayabilir.
matsolof

1
"\ s Bir boşluk karakteriyle eşleştir" ifadesinde, neden bir satırsonu ile eşleşir?
Michael Z

2
Tüm boşlukları kaldırmak / değiştirmek (çift) boşlukları kaldırmak / değiştirmek için bir çözüm arıyordum. Bunu yapan normal ifade:/(?![ ])\s+/
algoritma

Sadece çözümünüzün bana çok zaman kazandığını bildirmek istedim.
Parthapratim Neog

183

Kabul edilen cevap hakkında birkaç yorum:

+Aracı "1 ya da daha fazla". Tekrarlamanız gerektiğini sanmıyorum \s. Bence sadece yazabilirsin '/\s+/'.

Ayrıca, dizede önce ve son olarak boşluk kaldırmak istiyorsanız, ekleyin trim.

Bu değişikliklerle kod şöyle olur:

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

Haklısın; /\s\s+/satır beslemesiyle eşleşemez foo\nbar.
Alan Moore

79

Sadece kullan preg_replace()

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

str_replace()Kod temiz görünmese de, bununla başa çıkabilirsiniz :

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

İdeone'de canlı izleyin


1
OP, "paragraflar" ile "for" arasında bir boşluk istiyor. Yeni satır karakterlerini kaldırırsanız, yeni satır karakterleri kaldırılmaz.
Daniel Vandersluis

lütfen bunu düzeltin$string = preg_replace("~[\r\n]~", "",$string);
erikbwork

Aksi takdirde söyleyecek başka bir şey yok. en basit cevap bu bence!
erikbwork

3
@erik Sonra "yanlış" olurdu. Olduğu gibi iyi çalışıyor.
NullUserException

1
@Vineet Normal ifadenin başlangıç ​​ve bitişini belirten bir sınırlayıcı
NullUserException

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

3
PHP'deki kaçış dizilerinin çift tırnak içine alınması gerekir.
Daniel Vandersluis

Bu OP'nin istediği şeyi tam olarak yapmaz, çünkü bu anlaşılması \r
zorun

@NullUser: Buna yorum yapmak yerine neden kendi yayınınızı güncellemiyorsunuz?
fabrik

@NullUser: Her şeyi '' yerine '' ile değiştirmesi dışında.
fabrik

12

Hızı için str_replace kullanmalı ve bir dizi ile çift tırnak işareti kullanmalısınız

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

Kaynakları az, mükemmel, tks.
CONvid19

1
Yanılıyor olabilirim ama bu kod Unix sistemlerinde yeni satır karakterini kaldırmıyor çünkü bu sistemlerde yeni satır sadece \nve \r\ndahası değil OP'nin yeni satırların yerine tek bir boşluk koymak istediğini düşünüyorum
Marco Demaio

7

Bunun zaten gönderilen cevaplara karşı herhangi bir değeri olup olmadığından emin değilim ama bunu da gönderebilirim.

// 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

PCRE normal ifade değiştirmeleri preg_replace kullanılarak yapılabilir: http://php.net/manual/en/function.preg-replace.php

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

Yeni satırın yerini alır veya karakterleri boşlukla döndürür. Bunların yerine başka bir şey koymak istemiyorsanız 2. bağımsız değişkeni olarak değiştirin ''.


1
pregFonksiyonları PCRE'yi değil POSIX, normal ifadeler kullanır. Orada eregPOSIX kullanmak işlevleri, ancak şimdi artık yok.
Daniel Vandersluis

5

Bunu kullan:

yeni satır serisini boş bir dizeyle değiştir:

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

veya muhtemelen yeni satırları tek bir boşlukla değiştirmek istiyorsunuz:

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

Lütfen kodunuzu doğru şekilde biçimlendirin. Bu, ilgili satıra dört boşluk girintisi yapılarak yapılır.
jwueller

2
Bu yüzden tek tırnak kullanıyorum, bu yüzden bu karakterlerden kaçmam gerekmiyor. \\nkorkunç görünüyor. \\\\ tek bir ters eğik çizgiyi eşleştirmek çok kötü.
NullUserException

5

Kaçış dizisi\R genel bir satırsonu ile eşleşir

yani, Unicode tarafından bir satır aralığı dizisi olarak kabul edilen herhangi bir şey . Bu, \v( dikey boşluk ) ile eşleşen tüm karakterleri ve çoklu karakter dizisini içerir \x0D\x0A...

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

8-bit UTF-8 olmayan modda \Raşağıdakine eşittir: (?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

Regex101 Gösteri


Anton, düzenlemem uygunsa lütfen kontrol edin! Daha fazla bilgi eklendi.
bobble bubble

4

Metindeki satır kesmeleri genellikle şu şekilde temsil edilir:

\ r \ n - bir Windows bilgisayarında

\ r - Apple bilgisayar üzerinde

\ n - Linux'ta

//Removes all 3 types of line breaks

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

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

3

Ne hakkında:

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

Bu oldukça sağlam bir çözüm olmalı çünkü yanlış değilsem \ n tüm sistemlerde düzgün çalışmıyor ...


Bu \ r yerine görünmüyor ama sadece \ n: ideone.com/28KPcb
T30

Kılavuzda belirtildiği gibi PHP_EOL geçerli platform için doğru 'Hat Sonu' sembolünü içerir. Dizeleri diğer platformlardan içe aktarıyorsanız veya yalnızca kötü biçimlendirilmiş dizeleriniz varsa bu kesilebilir.
GDY

Oldukça kapalı bir ortamınız varsa, bu benim için en şık çözüm gibi görünüyor çünkü platformu bağımsız ve muhtemelen oldukça iyi performans… İthalat / ihracat senaryoları gibi daha geniş bir girdiniz varsa muhtemelen bir normal ifade çözümü kullanmalısınız.
GDY

3

Regex hakkında herkesin ne kadar az şey bildiğini görünce şaşırdım.

Php Strip newlines olduğunu

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

Perl cinsinden

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

Anlam, satırın sonundaki herhangi bir yeni satır karakterini (verimlilik için) - isteğe bağlı olarak bir satır başı ile - bir boşlukla değiştirir.

\ n veya \ 015 yeni satır. \ r veya \ 012 satır başıdır. ? normal ifade içinde bir önceki karakterin 1 veya sıfır eşleşmesi anlamına gelir. Normal ifadede $, satır sonu eşleşmesi anlamına gelir.

Orijinal ve en iyi regex referansı perldoc perlre, her kodlayıcı bu dokümanı oldukça iyi bilmelidir: http://perldoc.perl.org/perlre.html Tüm özelliklerin tüm diller tarafından desteklenmediğini unutmayın.


Bu çözüm benim için işe yaramadı, ancak belirtildiği gibi, gerçek çözümü üretmek için daha fazla okumam gerekecek. Bu işe yaramadı şaşırdım.
Adam Whateverson

2

kullanacağım kalıp bu

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

2

belki bu işe yarar:

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

1

Bu sekmeleri de kaldırır

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

1

Aşağıdaki kodu, metninizdeki boşlukları ve yeni satırları koruyacak şekilde deneyebilirsiniz.

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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


0

Aşağıdaki kod çalışması tüm metni lütfen kullanın:

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

0

Yeni çizgiyi ve birden çok beyaz boşluğu kaldırabilirsiniz.

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

echo $name;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.