Dizeden satır sonları (karakter yok!) Nasıl kaldırılır?


151

Bu bir dupe gibi görünebilir, ancak emin olun öyle değildir - hem SO'yu hem de web'in geri kalanını sorunuma bir cevap için araştırdım ve aynı yetersiz "çözümleri" defalarca buldum. Her neyse, işte burada:

Bir metin alanından bir MySQL veritabanına kullanıcı girişini kaydediyorum (bir WordPress ortamında, ancak bunun bu sorun için önemli olmaması gerektiğine inanıyorum). Daha sonra sitenin arka ucunda Yöneticilere gösterilmek üzere DB'den alınır. Sorun, kullanıcılar satır sonu içeren metin gönderdiklerinde ortaya çıkar (yani, Enter tuşuna bastığında).

Örnek bir dize şöyle görünebilir:

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

Greetings,
Bill

Dizede satır sonu karakteri ("\ n", "\ r" veya benzeri) yoktur.

nl2br()HTML çıktısı oluşturmak için kullanıyorum , ancak bu yeterli değil. Sonuç şu şekilde:

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

nl2br()Etiketleri eklediği ve ilk başta satır sonlarının yerini alması gerekmediği için anladığım kadarıyla beklenen sonuç hangisidir?

Ancak ihtiyacım olan format şu olurdu:

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

Dizesi böyle "\ n" İçinde, ben de onu vururdu olarak EOL karakterleri olsaydı str_replace()ya preg_replace()ve onunla yapılabilir, ancak hiçbir karakter yoksa ne iğne bu işlevlerden birini beslemesine hiçbir ipucu var ilk başta.

Veritabanındaki ilgili alana manuel olarak erişebilirim, her satır sonu için Backspace'e basabilirim ve daha sonra string ile yapmak istediğim işler. Bu yüzden yukarıdaki formata ihtiyacım olduğunu biliyorum.


Dize ilk örneğiniz gibi görünüyorsa, içinde satır sonu karakterlerinin olmadığını nasıl söyleyebilirsiniz? "Teşekkürler" den sonra arka arkaya en az iki tane var!
Ernest Friedman-Hill

Fair enuff @ ErnestFriedman-Hill, açıkça haklısınız - orada "bir şey" var, ne görünür ne de bildiğim bir şey.
Johannes Pille

Satır sonu karakterleri olmadan yeni satırlara sahip olmanın nasıl mümkün olduğunu da göremiyorum. Dizeyi incelemek için bir onaltılık düzenleyici kullanabilir misiniz - Yeni satırlar için karakterleri bulacağınızdan eminim ...
ısırgan

Yanıtlar:


381

Tüm yeni satırları ve satır başlarını kaldıran bir preg ile değiştirebilmelisiniz. Kod:

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

\nKarakterler görünmese bile , eğer vagon dönüşleri alıyorsanız orada görünmez bir karakter var. Preg replasmanı bunları yakalamalı ve düzeltmelidir.


Inanılmaz. Her ikisi de işi yapan sizin ve @bsdnoobz cevaplarının çizgisindeki her şeyi denediğime yemin edebilirdim. Oh pekala, orada zihinsel engelim ne olursa olsun, ikiniz de bana tonlarca zaman kurtardınız. Sanırım oldukça saçma bir soru olduğu ortaya çıktı. Teşekkürler beyler!
Johannes Pille

3
Bunun tüm satır sonlarıyla, yani Windows sistemlerinde oluşturulanlarla eşleşmeyeceğini unutmayın. Bunları yakalamak için, bunun yerine şu /\r|\n|\r\n/
Normal İfadeyi

6
\ R (herhangi bir satır sonlandırma dizisini temsil eder) kullanın stackoverflow.com/a/16274784/1491212
Armel Larcier

447

Ben'in çözümü kabul edilebilir, ancak str_replace () preg_replace () ' den çok daha hızlı

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

Daha az CPU gücü kullanmak, dünya karbondioksit emisyonlarını azaltır.


5
Bu cevabın daha fazla itibar görmediğine inanamıyorum. Preg_replace ()
pim

64
ÖNEMLİ: Satır başı ve satırsonu kodları etrafında ÇİFT TEKLİF kullanın. Tek tırnak kullanırsanız bunlar doğru şekilde işlenmez!
bwright

49
Beğen -> "Daha az CPU gücü kullanmak, dünya karbondioksit emisyonlarını azaltır."
Jan

3
@Joeri: İlk ikisi tarafından ele alınacağı için sonuncusu asla aranmayacak. Gereksiz kod.
nightfox89

4
@Joeri str_replace'in tüm oluşumları sildiğini düşünürsek , \ r ve \ n her ikisi de yine de kaldırılmaz mı?
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

11

Çünkü nl2br()yeni satırları hiç kaldırmıyor.

İade ile dize <br />veya <br> öncesinde eklenen tüm satırsonlarının ( \r\n, \n\r, \nve \r).

str_replaceBunun yerine kullanın :

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

7

PHP trim de kullanabilirsiniz

Bu işlev, dizenin başından ve sonundan ayrılmış beyaz boşluklu bir dize döndürür. İkinci parametre olmadan, trim () şu karakterleri çıkarır:

  • "" (ASCII 32 (0x20)), sıradan bir boşluk.
  • "\ t" (ASCII 9 (0x09)), bir sekme.
  • "\ n" (ASCII 10 (0x0A)), yeni bir satır (satır besleme).
  • "\ r" (ASCII 13 (0x0D)), bir satır başı.
  • "\ 0" (ASCII 0 (0x00)), NUL-baytı.
  • "\ x0B" (ASCII 11 (0x0B)), dikey sekme.

4
Bu yalnızca dizenin başında ve sonunda yeni satırları hedefleyecektir. Dizenin ortasındaki yeni satırlara dokunulmayacaktır.
mickmackusa

6

Windows'ta da düzgün çalışabilmek için şunu kullanmanızı öneririm:

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

"\r\n"- Windows için, "\r"- Mac için ve "\n"- Linux için


2
Üzgünüm dostum, ama '12'de soran kişi olsam bile, bunun gereksiz olduğunu kesinlikle söyleyebilirim. Kendinize şunu sorun: Eğer dizide hepsi \rve \nçıkarılmışsa, neden birbirini doğrudan takip edenler için durum böyle olmasın?
Johannes Pille

Gerçekten, bu bariz şey aklıma gelmedi ... Teşekkürler :) Bununla ilgili sorunlar yaşadığımı yeni fark ettim, ama tam tersi oldu \r\n, Windows'ta kullandım ve Linux'ta çalışmadı.
Ajjaah

Pekala, bu işlevi satır sonlarını virgüllerle değiştirmek için kullanıyorum, böylece bir adres tek satırlık bir metindir, bu nedenle İLK'in değiştirilmesi \r\nyardımcı olur, çünkü bu satır kesilirse her bölüm için iki yerine bir virgül anlamına gelir
Martin

@Martin Evet, haklısın, ben de aynı şeyi fark ettim, bu yüzden önce değiştiririz \r\n, sonra değiştiririz \rve \ncevabımı düzenledim.
Ajjaah

Bu hala gereksizdir, eğer hepsini kaldıracaksanız \rve \rkaldırmaya gerek yoktur , aynı sonucu almak için \r\nkullanıcı yapabilirsiniz str_replace(array("\r","\n"), "", $buffer);.
stramin

6

str_replace (PHP_EOL, null, $ str);


1
bu soruya cevap verebilir, cevabınız hakkında biraz açıklama yapmanız önerilir.
Anirudh Sharma

PHP_EOL dizeyi okuduğunuzda her zaman çalışmaz. Onları yazdığınızda işe yarar.
nightfox89

Yalnızca kod yanıtları StackOverflow'da düşük değerlidir çünkü OP'yi ve gelecekteki okuyucuları eğitmek için çok az şey yaparlar.
mickmackusa

5

Biraz daha işlevsel bir şey (her yerde kullanımı kolay):

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

Arama değiştirme parametresi olarak PHP_EOL kullanmak da iyi bir fikirdir! Tebrikler.


1

Alternatif yerleşik: 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.

Farklı türdeki metin dosyalarından satır sonlarını kaldırmak için oradadır, ancak html'yi işlemez.


0

Bu işi yapmak için 3 satır kullanıyorum, bu yüzden $ s'yi "eşyalarınız" olarak düşünün ...

$s=str_replace(chr(10),'',$s);
$s=str_replace(chr(13),'',$s);
$s=str_replace("\r\n"),'',$s);
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.