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.