Jak usunąć podziały wierszy (bez znaków!) Z ciągu?

146

Może się to wydawać oszustwem, ale zapewniam, że tak nie jest - przeszukiwałem zarówno SO, jak i resztę sieci, aby znaleźć odpowiedź na mój problem i ostatecznie znajdowałem te same niewystarczające „rozwiązania” w kółko. Tak czy inaczej, oto jest:

Zapisuję dane wejściowe użytkownika z obszaru tekstowego do bazy danych MySQL (w środowisku WordPress, ale uważam, że nie powinno to mieć znaczenia dla tego problemu). Jest później pobierany z bazy danych i pokazywany administratorom w zapleczu witryny. Problem pojawia się, gdy użytkownicy przesyłają tekst z podziałem wiersza (tj. Naciskają klawisz Enter).

Przykładowy ciąg może wyglądać następująco:

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

Greetings,
Bill

W ciągu nie ma znaków końca wiersza („\ n”, „\ r” itp.).

Używam nl2br()go do generowania danych wyjściowych HTML, ale to nie wystarczy. Wynik to:

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

Który, o ile rozumiem, jest oczekiwanym nl2br()rezultatem, ponieważ wstawia tagi i nie ma w pierwszej kolejności zastępować podziałów wierszy?

Jednak format, którego potrzebuję, byłby następujący:

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

Gdyby ciąg zawierał znaki EOL, takie jak „\ n”, uderzyłbym go albo str_replace()albo preg_replace()i skończyłbym z tym, ale nie mam pojęcia, którą igłę podać do którejkolwiek z tych funkcji, jeśli nie ma tam żadnych znaków na pierwszym miejscu.

Mogę ręcznie uzyskać dostęp do odpowiedniego pola w bazie danych, naciskać Backspace przy każdym podziale wiersza i to, co chcę później zrobić ze stringiem, działa. Więc wiem, że potrzebuję powyższego formatu.

Johannes Pille
źródło
Jeśli ciąg wygląda jak Twój pierwszy przykład, jak możesz powiedzieć, że nie zawiera znaków końca wiersza? Jest co najmniej dwa: dwa z rzędu po „dzięki!”
Ernest Friedman-Hill
Fair enuff @ ErnestFriedman-Hill, oczywiście masz rację - jest tam „coś”, po prostu nie jest widoczne ani nic, co wiem.
Johannes Pille
Nie rozumiem też, jak można mieć nowe wiersze bez znaków końca wiersza. Czy możesz użyć edytora szesnastkowego do sprawdzenia ciągu - jestem pewien, że znajdziesz znaki dla nowych linii ...
pokrzywa

Odpowiedzi:

376

Powinieneś być w stanie zastąpić go preg, który usuwa wszystkie nowe linie i powroty karetki. Kod to:

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

Mimo że \nznaki się nie pojawiają, jeśli otrzymujesz powrót karetki, jest tam niewidoczny znak. Wymiana preg powinna je złapać i naprawić.

Ben Roux
źródło
Nie do wiary. Mógłbym przysiąc, że spróbowałem wszystkiego zgodnie z twoimi i @bsdnoobz odpowiedziami, które wykonują zadanie. No cóż, niezależnie od mentalnej blokady, którą tam miałem, oboje zaoszczędziliście mi mnóstwo czasu. Wydaje mi się, że to dość głupie pytanie. Dzięki chłopaki!
Johannes Pille
3
Zauważ, że nie będzie to pasowało do wszystkich podziałów linii, tj. Tych utworzonych w systemach Windows. Aby je złapać, możesz zamiast tego użyć następującego /\r|\n|\r\n/
wyrażenia regularnego
6
użyj \ R (co oznacza dowolną sekwencję końca linii) stackoverflow.com/a/16274784/1491212
Armel Larcier
435

Rozwiązanie Bena jest dopuszczalne, ale str_replace () jest znacznie szybsze niż preg_replace ()

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

Zużywając mniej mocy procesora, redukuje światową emisję dwutlenku węgla.

Demis Palma ツ
źródło
5
Nie mogę uwierzyć, że ta odpowiedź nie zyskuje większego uznania. 100 kciuków w górę w porównaniu z preg_replace ()
pimbrouwers
62
WAŻNE: użyj PODWÓJNYCH CYTATÓW wokół kodów powrotu karetki i nowego wiersza. Nie zostaną one poprawnie przetworzone, jeśli użyjesz apostrofów!
bwright
47
Kciuki w górę -> „Zużycie mniejszej mocy procesora zmniejsza światową emisję dwutlenku węgla”.
stycznia
3
@Joeri: Ten ostatni nigdy nie zostanie wywołany, ponieważ byłby obsługiwany przez pierwszych dwóch. To nadmiarowy kod.
nightfox89
4
@Joeri Biorąc pod uwagę, że str_replace usuwa wszystkie wystąpienia, czy \ r i \ n zarówno WSZYSTKIE jak i tak nie zostałyby usunięte?
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
bez przepływu
źródło
11

To dlatego, że w nl2br()ogóle nie usuwa nowych linii.

Zwraca łańcuch znaków z <br />lub <br> wstawione przed wszystkimi nowymi liniami ( \r\n, \n\r, \ni \r).

Użyj str_replacezamiast tego:

$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
kenorb
źródło
7

Możesz także użyć przycinania PHP

Ta funkcja zwraca łańcuch z białymi znakami usuniętymi z początku i końca słowa. Bez drugiego parametru trim () usunie te znaki:

  • „” (ASCII 32 (0x20)), zwykła spacja.
  • "\ t" (ASCII 9 (0x09)), karta.
  • „\ n” (ASCII 10 (0x0A)), nowa linia (nowy wiersz).
  • „\ r” (ASCII 13 (0x0D)), powrót karetki.
  • „\ 0” (ASCII 0 (0x00)), bajt NUL.
  • „\ x0B” (ASCII 11 (0x0B)), tabulator pionowy.
Gijs de Jong
źródło
3
Będzie to kierowane tylko na znaki nowej linii na początku i na końcu ciągu. Nowe linie na środku łańcucha pozostaną nietknięte.
mickmackusa
6

Aby działać poprawnie również w systemie Windows, sugerowałbym użycie

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

"\r\n"- dla systemu Windows, "\r"- dla komputerów Mac i "\n"- dla systemu Linux

Ajjaah
źródło
2
Przepraszam kolego, ale nawet będąc tym, który pytał w dwunastym roku, mogę ci powiedzieć z całkowitą pewnością, że jest to zbędne. Zadaj sobie następujące pytania: jeśli wszystkie \ri \nzostaną usunięte w ciągu, dlaczego nie miałoby to mieć miejsca w przypadku tych, które następują bezpośrednio po sobie?
Johannes Pille
Naprawdę, ta oczywista rzecz nie przyszła mi do głowy ... Dzięki :) Właśnie zdałem sobie sprawę, że mam z tym kłopoty, ale było odwrotnie, używałem \r\nna Windowsie i nie działało na Linuksie.
Ajjaah
Cóż, używam tej funkcji, aby zastąpić podziały wierszy przecinkami, więc adres jest tekstem w jednym wierszu, więc zastąpienie \r\nFIRST pomogłoby, ponieważ oznacza to jeden przecinek zamiast dwóch dla każdej części, jeśli ten podział wiersza
Martin
@Martin Tak, masz rację, właśnie zdałem sobie sprawę, że to samo, więc \r\nnajpierw wymieniamy , potem zastępujemy \ri \nzredagowałem odpowiedź.
Ajjaah,
Jest to nadal zbędne, jeśli zamierzasz usunąć wszystkie \ri \rnie ma potrzeby usuwania \r\n, możesz użyć użytkownika, str_replace(array("\r","\n"), "", $buffer);aby uzyskać ten sam wynik.
stramin
6

str_replace (PHP_EOL, null, $ str);

Rafanake
źródło
1
chociaż to może odpowiedzieć na pytanie. Zaleca się, aby trochę wyjaśnić swoją odpowiedź.
Anirudh Sharma
PHP_EOL nie zawsze działa, gdy czytasz ciąg. Robi się, kiedy je piszesz.
nightfox89
Odpowiedzi zawierające tylko kod mają niską wartość w StackOverflow, ponieważ niewiele robią, aby przeszkolić OP i przyszłych czytelników.
mickmackusa
4

Coś bardziej funkcjonalnego (łatwego w użyciu w dowolnym miejscu):

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

Używanie PHP_EOL jako parametru zastępującego wyszukiwanie jest również dobrym pomysłem! Sława.

tfont
źródło
1

Alternatywne wbudowane: przycinanie ()

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.

Jest tam, aby usuwać podziały wierszy z różnych rodzajów plików tekstowych, ale nie obsługuje html.

NVRM
źródło
0

Używam 3 wierszy do wykonania tej pracy, więc traktuj $ s jako swoje „rzeczy” ...

$s=str_replace(chr(10),'',$s);
$s=str_replace(chr(13),'',$s);
$s=str_replace("\r\n"),'',$s);
PYK
źródło