Elimină liniile noi din șir și înlocuiește-le cu un spațiu gol (Programare, Php, Regex, String)

James a intrebat.
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

Doresc să elimin toate liniile noi din șir.

Am acest regex, le poate prinde pe toate, problema este că nu știu cu ce funcție ar trebui să îl folosesc.

/r
|r|
/

$string ar trebui să devină:

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

Comentarii

  • Dacă efectuați mii de înlocuiri, evitați să folosiți preg_replace. Este aproape de două ori mai lent decât str_replace. –  > Por Alex W.
  • S-ar putea găsi s($str)->normalizeLineEndings('') util, așa cum se găsește în această bibliotecă independentă. Aceasta va elimina nu numai LF, CR și CRLF, ci și orice newline Unicode. –  > Por caw.
19 răspunsuri
jwueller

Trebuie să fiți atenți la întreruperile duble de linie, care ar provoca spații duble. Folosiți această expresie regulată foarte eficientă:

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

Spațiile multiple și liniile noi sunt înlocuite cu un singur spațiu.

Editați: După cum au subliniat și alții, această soluție are probleme de potrivire a noilor linii unice între cuvinte. Acest lucru nu este prezent în exemplu, dar se poate vedea cu ușurință cum ar putea apărea această situație. O alternativă este de a face următoarele:

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

Comentarii

  • Înainte de a utiliza această soluție, consultați răspunsul meu de mai jos și comentariile la răspunsul meu. Este posibil ca această soluție să nu funcționeze așa cum vă așteptați. –  > Por matsolof.
  • în expresia regulată „s Match a whitespace character”, de ce ar trebui să se potrivească cu un newline? –  > Por Michael Z.
  • Căutam o soluție pentru a elimina/înlocui toate spațiile albe, dar nu și spațiile (duble). Aceasta este regex-ul care a reușit: /(?![ ])s+/ –  > Por Algoritm.
  • Am vrut doar să vă anunț că soluția dvs. mi-a salvat mult timp. –  > Por Parthapratim Neog.
  • Greșit. s se potrivește cu orice spațiu alb, inclusiv spațiu, tabulație, linie nouă, întoarcere de cărămidă. Nu am nicio idee cum de a primit atâtea voturi în sus. Pentru a se potrivi cu liniile noi, aveți nevoie de r?
    , care este o linie nouă, precedată opțional de o revenire la cărămidă. –  > Por ekerner.
matsolof

Câteva comentarii cu privire la răspunsul acceptat:

+ înseamnă „1 sau mai mulți”. Nu cred că este nevoie să repetați s. Cred că puteți scrie pur și simplu '/s+/'.

De asemenea, dacă doriți să eliminați spațiile albe din primul și ultimul șir, adăugați trim.

Cu aceste modificări, codul ar fi:

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

Comentarii

  • Aveți dreptate; /ss+/ nu ar reuși să se potrivească cu linia de linie din foo
    bar
    . –  > Por Alan Moore.
NullUserException

Folosiți pur și simplu preg_replace()

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

Ai putea scăpa cu str_replace() în acest caz, deși codul nu arată la fel de curat:

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

Vedeți-l în direct pe ideone

Comentarii

  • OP dorește un spațiu între „paragraphs” și „for”. Dacă eliminați doar caracterele newline, nu va exista. –  > Por Daniel Vandersluis.
  • vă rugăm să corectați în $string = preg_replace("~[r
    ]~", "",$string);
    –  > Por erikbwork.
  • Altfel, nu mai este nimic de spus. acesta este cel mai simplu răspuns, cred! –  > Por erikbwork.
  • @erik Atunci aș fi „incorecte”. Funcționează bine așa cum este. –  > Por NullUserException.
  • @Vineet Este doar un delimitator care denotă începutul și sfârșitul regex-ului –  > Por NullUserException.
fabrik
$string = str_replace(array("
", "r"), ' ', $string);

Comentarii

  • Secvențele de evacuare în PHP trebuie să fie cotate dublu. –  > Por Daniel Vandersluis.
  • Totuși, acest lucru nu face exact ceea ce vrea OP, deoarece este același lucru cu răspunsul lui Elusive și nu elimină r caracterele –  > Por NullUserException.
  • @NullUser: De ce nu-ți actualizezi propria postare în loc să comentezi la asta? –  > Por fabrik.
  • @NullUser: Cu excepția faptului că înlocuiește totul cu ” în loc de ‘ ‘ ‘. –  > Por fabrik.
RobertPitt

Ar trebui să folosiți str_replace pentru viteza sa și utilizarea ghilimelelor duble cu o matrice

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

Comentarii

  • Scăzut în resurse, perfect, tks. –  > Por Pedro Lobito.
  • S-ar putea să mă înșel, dar acest cod nu elimină char-ul de linie nouă pe sistemele Unix, deoarece pe aceste sisteme linia nouă este doar
    și nu r
    în plus, cred că OP cere să pună un singur spațiu în locul noilor linii –  > Por Marco Demaio.
  • @MarcoDemaio, adăugați doar "
    ", "
    r"
    la matrice. –  > Por Arris.
Peter

Nu sunt sigur dacă acest lucru are vreo valoare față de răspunsurile deja trimise, dar pot la fel de bine să îl postez.

// Create an array with the values you want to replace
$searches = array("r", "
", "r
");

// Replace the line breaks with a space
$string = str_replace($searches, " ", $string);

// Replace multiple spaces with one
$output = preg_replace('!s+!', ' ', $string);

n00dle

Înlocuirile PCRE regex pot fi făcute folosind preg_replace:http://php.net/manual/en/function.preg-replace.php

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

Ar înlocui caracterele de linie nouă sau de întoarcere cu un spațiu. Dacă nu doriți ca nimic să le înlocuiască, schimbați al doilea argument în ''.

Comentarii

  • Aplicația preg utilizează expresii regulate PCRE, nu POSIX. Există ereg funcții care utilizează POSIX, dar acestea sunt acum depreciate. –  > Por Daniel Vandersluis.
netom

Utilizați acest lucru:

înlocuiți seria de linii noi cu un șir gol:

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

sau probabil doriți să înlocuiți liniile noi cu un singur spațiu:

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

Comentarii

  • Vă rugăm să formatați codul în mod corespunzător. Acest lucru se face prin indentarea liniei relevante cu patru spații. –  > Por jwueller.
  • De aceea folosesc ghilimele simple, astfel încât să nu fie nevoie să evadez aceste caractere.
    arată groaznic. \\ pentru a potrivi o singură backslash este pur și simplu îngrozitor. –  > Por NullUserException.
Anton

Secvență de evacuare R se potrivește cu o linie nouă generică

adică orice lucru considerat un secvență de întrerupere a liniei de către Unicode. Aceasta include toate caracterele care se potrivesc cu v (spații albe verticale), și secvența de mai multe caractere x0Dx0A

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

În modul non-UTF-8 pe 8 biți R este echivalent cu următoarele: (?>r
|
|x0b|f|r|x85)
pcre.org

Demo Regex101

Comentarii

  • Anton vă rog să verificați, dacă editarea mea este în regulă! Am adăugat câteva informații suplimentare. –  > Por bobble bubble.
ekerner

Am fost surprins să văd cât de puțin știe toată lumea despre regex.

Strip newlines în php este

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

În perl

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

Înseamnă înlocuirea oricărui caracter de newline la sfârșitul liniei (pentru eficiență) – precedat opțional de o întoarcere de cărămidă – cu un spațiu.

sau 15 este newline.r sau 12 este revenire la cărămidă.? în regex înseamnă că se potrivește cu 1 sau zero din caracterul anterior.$ în regex înseamnă că se potrivește cu sfârșitul liniei.

Cea mai bună și originală referință regex este perldoc perlre, fiecare programator ar trebui să cunoască acest document destul de bine:http://perldoc.perl.org/perlre.htmlRețineți că nu toate caracteristicile sunt acceptate de toate limbajele.

Comentarii

  • Această soluție nu a funcționat pentru mine, dar, așa cum am menționat, va trebui să citesc mai mult pentru a produce soluția reală. Am fost surprins că nu a funcționat. –  > Por Adam Whateverson.
  • @AdamWhateverson Nu, cele de mai sus sunt corecte. Poate că șirurile dvs. au literal backslash n în loc de caractere newline? De asemenea, în unele limbi este posibil să fie nevoie să adăugați modificatorul m (multiline). –  > Por ekerner.
Md. Al Amin Bhuiyan

Pauzele de linie în text sunt în general reprezentate ca:

r
– pe un computer Windows

r – pe un computer Apple


– pe Linux

//Removes all 3 types of line breaks

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

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

Rajeev

acesta este modelul pe care l-aș folosi

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

GDY

Despre ce este vorba:

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

Aceasta ar trebui să fie o soluție destul de robustă, deoarece
nu funcționează corect în toate sistemele, dacă nu mă înșel …

Comentarii

  • Acest lucru nu pare să înlocuiască r, ci doar
    : ideone.com/28KPcb –  > Por T30.
  • După cum se menționează în manual, PHP_EOL conține simbolul corect „End Of Line” pentru platforma curentă. Dacă importați șiruri de caractere de pe alte platforme sau dacă aveți șiruri prost formatate, acest lucru se poate defecta. –  > Por GDY.
  • Dacă aveți un mediu destul de închis, aceasta mi se pare cea mai elegantă soluție, deoarece este independentă de platformă și, probabil, destul de performantă… dacă aveți intrări mai largi, cum ar fi scenarii de import/export, probabil că ar trebui să folosiți o soluție regex. –  > Por GDY.
utilizator3213174

Aceasta elimină, de asemenea, filele

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

PCMShaper

Puteți încerca codul de mai jos va păstra orice spațiu alb și linii noi în textul dvs.

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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

زياد

poate că acest lucru funcționează:

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

Adam Whateverson

Multe dintre aceste soluții nu au funcționat pentru mine. acest lucru a făcut truc totuși:-

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

Aici este referința:-PCRE și liniile noi

user8031209

acest cod de mai jos funcționează tot textul vă rugăm să îl folosiți:

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

Ramesh

Puteți elimina linia nouă și spațiile albe multiple.

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

echo $name;