Rimuovi le nuove linee dalla stringa e sostituiscile con uno spazio vuoto


291
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

Vuoi rimuovere tutte le nuove righe dalla stringa.

Ho questo regex, può prenderli tutti, il problema è che non so con quale funzione dovrei usarlo.

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

$string dovrebbe diventare:

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

1
Se stai facendo migliaia di sostituzioni, evita di usarlo preg_replace. È quasi due volte più lento di str_replace.
Alex W,

Potresti trovare s($str)->normalizeLineEndings('')utile, come si trova in questa libreria indipendente . Rimuoverà non solo LF, CR e CRLF, ma anche qualsiasi newline Unicode.
Caw,

Risposte:


578

Devi stare attento alle interruzioni di doppia linea, che causerebbero doppi spazi. Usa questa espressione regolare davvero efficiente:

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

Più spazi e nuove righe vengono sostituiti con un singolo spazio.

Modifica: come altri hanno sottolineato, questa soluzione presenta problemi di corrispondenza tra singole righe tra le parole. Questo non è presente nell'esempio, ma si può facilmente vedere come potrebbe verificarsi quella situazione. Un'alternativa è quella di fare quanto segue:

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

10
Prima di utilizzare questa soluzione, vedere la mia risposta di seguito e i commenti alla mia risposta. Questa soluzione potrebbe non funzionare come previsto.
matsolof,

1
nell'espressione regolare "\ s Abbina un carattere di spazio", perché dovrebbe corrispondere a una nuova riga?
Michael Z,

2
Stavo cercando una soluzione per rimuovere / sostituire tutti gli spazi bianchi ma non (doppi) spazi. Questa è la regex che l'ha fatto:/(?![ ])\s+/
algoritmo

Volevo solo farti sapere che la tua soluzione mi ha fatto risparmiare un sacco di tempo.
Parthapratim Neog,

183

Alcuni commenti sulla risposta accettata:

I +mezzi "1 o più". Non penso che tu debba ripetere \s. Penso che tu possa semplicemente scrivere '/\s+/'.

Inoltre, se si desidera rimuovere prima e l'ultimo spazio bianco nella stringa, aggiungere trim.

Con queste modifiche, il codice sarebbe:

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

Hai ragione; /\s\s+/non corrisponderebbe all'alimentazione di linea foo\nbar.
Alan Moore,

79

Basta usare preg_replace()

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

Potresti cavartela con str_replace()questo, anche se il codice non sembra pulito:

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

Guardalo dal vivo su ideone


1
OP vuole uno spazio tra "paragrafi" e "per". Se rimuovi solo i caratteri di nuova riga, non ce ne sarà uno.
Daniel Vandersluis,

per favore correggilo a$string = preg_replace("~[\r\n]~", "",$string);
erikbwork il

Altrimenti non c'è altro da dire. questa è la risposta più semplice, credo!
erikbwork,

3
@erik Allora lo "incorretto". Funziona bene così com'è.
NullUserException,

1
@Vineet È solo un delimitatore che indica l'inizio e la fine del regex
NullUserException

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

3
Le sequenze di escape in PHP devono essere racchiuse tra virgolette.
Daniel Vandersluis,

Questo non fa esattamente quello che vuole l'OP, dato che è la stessa della risposta inafferrabile e non rimuove i \rcaratteri
NullUserException

@NullUser: Perché non aggiorni il tuo post invece di commentarlo?
fabrik,

@NullUser: Tranne il fatto che sostituisce tutto con '' anziché ''.
fabrik,

12

Dovresti usare str_replace per la sua velocità e usare le virgolette doppie con un array

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

Basso contenuto di risorse, perfetto, tks.
CONvid19,

1
Potrei sbagliarmi, ma questo codice non rimuove il nuovo carattere di linea sui sistemi Unix perché su quei sistemi la nuova linea è giusta \ne non \r\npenso inoltre che l'OP stia chiedendo di mettere un singolo spazio al posto di nuove linee
Marco Demaio,

7

Non sono sicuro che questo abbia un valore rispetto alle risposte già inviate, ma posso anche pubblicarlo.

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

Le sostituzioni di PCRE regex possono essere fatte usando preg_replace: http://php.net/manual/en/function.preg-replace.php

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

Sostituirebbe la nuova riga o restituirebbe i caratteri con uno spazio. Se non si desidera che nulla li sostituisca, modificare il secondo argomento in ''.


1
Le pregfunzioni utilizzano espressioni regolari PCRE, non POSIX. Esistono eregfunzioni che utilizzano POSIX, ma ora sono obsolete.
Daniel Vandersluis,

5

Usa questo:

sostituire una serie di newline con una stringa vuota:

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

o probabilmente vuoi sostituire le nuove righe con un singolo spazio:

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

Si prega di formattare correttamente il codice. Questo viene fatto indentando la riga pertinente di quattro spazi.
jwueller,

2
Ecco perché uso virgolette singole, quindi non ho bisogno di sfuggire a quei personaggi. \\nsembra terribile. \\\\ abbinare una singola barra rovesciata è semplicemente orribile.
NullUserException,

5

La sequenza di escape\R corrisponde a una nuova riga generica

cioè qualsiasi cosa considerata una sequenza di interruzione di riga da Unicode. Ciò include tutti i caratteri corrispondenti a \v( spazio bianco verticale ) e la sequenza multi carattere \x0D\x0A...

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

In modalità non UTF-8 a 8 bit \Rè equivalente al seguente: (?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

Demo Regex101


Anton, per favore, controlla, se la mia modifica è ok! Aggiunte alcune ulteriori informazioni.
bolla bobble

4

Le interruzioni di riga nel testo sono generalmente rappresentate come:

\ r \ n - su un computer Windows

\ r - su un computer Apple

\ n - su Linux

//Removes all 3 types of line breaks

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

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

3

Di cosa si tratta:

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

Questa dovrebbe essere una soluzione abbastanza solida perché \ n non funziona correttamente in tutti i sistemi se non sbaglio ...


Questo non sembra sostituire \ r ma solo \ n: ideone.com/28KPcb
T30

Come menzionato nel manuale, PHP_EOL contiene il simbolo "Fine linea" corretto per la piattaforma corrente. Se importi stringhe da altre piattaforme o hai stringhe formattate in modo errato, ciò potrebbe interrompersi.
GDY

Se hai un ambiente piuttosto chiuso, questa mi sembra la soluzione più elegante perché indipendente dalla piattaforma e probabilmente abbastanza performante ... se hai input più ampi come scenari di importazione / esportazione, probabilmente dovresti usare una soluzione regex.
GDY

3

Sono stato sorpreso di vedere quanto poco tutti sanno di regex.

Striscia newline in php è

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

In perl

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

Il significato sostituisce qualsiasi carattere di nuova riga alla fine della riga (per efficienza) - facoltativamente preceduto da un ritorno a capo - con uno spazio.

\ n o \ 015 è newline. \ r o \ 012 è ritorno a capo. ? in regex significa corrispondenza 1 o zero del carattere precedente. $ in regex significa che corrisponde alla fine della riga.

Il riferimento regex originale e migliore è perldoc perlre, ogni programmatore dovrebbe conoscere abbastanza bene questo documento: http://perldoc.perl.org/perlre.html Nota che non tutte le funzionalità sono supportate da tutte le lingue.


Questa soluzione non ha funzionato per me, ma come detto, dovrò leggere di più per produrre la soluzione effettiva. Sono stato sorpreso che non ha funzionato.
Adam Whateverson,

2

questo è il modello che vorrei usare

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

2

forse questo funziona:

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

1

Questo rimuove anche le schede

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

1

Puoi provare qui sotto il codice per conservare gli spazi bianchi e le nuove righe nel testo.

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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

1

Molte di queste soluzioni non hanno funzionato per me. Questo ha funzionato però: -

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

Ecco il riferimento: - PCRE e New Lines


0

questo codice qui sotto funziona tutto il testo per favore usalo:

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

0

È possibile rimuovere la nuova linea e più spazi bianchi.

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

echo $name;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.