Come rimuovere le interruzioni di riga (nessun carattere!) Dalla stringa?


146

Questo potrebbe sembrare un inganno, ma non è certo - ho cercato sia il SO che il resto del web per una risposta al mio problema e ho finito per trovare le stesse "soluzioni" insufficienti. Comunque, ecco qui:

Sto salvando l'input dell'utente da un'area di testo a un database MySQL (all'interno di un ambiente WordPress, ma credo che non dovrebbe importare questo problema). Viene successivamente recuperato dal DB per essere mostrato agli amministratori nel back-end del sito. Il problema si verifica quando gli utenti inviano testo con interruzioni di riga (ovvero preme il tasto Invio).

Una stringa di esempio potrebbe apparire così:

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

Greetings,
Bill

Non ci sono caratteri di fine riga ("\ n", "\ r" o simili) nella stringa.

Lo sto usando nl2br()per generare output HTML, ma non è abbastanza. Il risultato è quindi:

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

Quale, per quanto ho capito, è il nl2br()risultato atteso , in quanto inserisce i tag e non dovrebbe sostituire le interruzioni di riga in primo luogo?

Tuttavia, il formato di cui ho bisogno sarebbe questo:

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

Se la stringa contenesse caratteri EOL come "\ n", la colpirei con o str_replace()o avrei preg_replace()finito con essa, ma non ho idea di quale ago alimentare entrambe le funzioni se non ci sono caratteri lì innanzitutto.

Posso accedere manualmente al campo pertinente nel DB, premere Backspace per ogni interruzione di riga e ciò che in seguito voglio fare con la stringa funziona. Quindi so di aver bisogno del formato sopra.


Se la stringa appare come il tuo primo esempio, come puoi dire che non contiene caratteri di interruzione di riga? Ne ha almeno due: due di fila dopo "grazie!"
Ernest Friedman-Hill,

Fair enuff @ ErnestFriedman-Hill, hai ovviamente ragione - c'è "qualcosa" lì, non è né visibile né nulla che io sappia.
Johannes Pille,

Inoltre non riesco a vedere come è possibile avere nuove righe senza caratteri di interruzione di riga. Puoi usare un editor esadecimale per ispezionare la stringa - Sono sicuro che troverai i caratteri per le nuove righe ...
Ortica

Risposte:


376

Dovresti essere in grado di sostituirlo con un preg che rimuove tutte le nuove righe e i ritorni a capo. Il codice è:

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

Anche se i \npersonaggi non vengono visualizzati, se stai ottenendo ritorni a capo c'è un personaggio invisibile lì. Il sostituto preg dovrebbe afferrare e riparare quelli.


Incredibile. Avrei potuto giurare di aver provato tutto secondo le tue risposte @bsdnoobz, che fanno entrambe il lavoro. Vabbè, qualunque blocco mentale avessi lì, mi avete risparmiato un sacco di tempo. Si è rivelata una domanda piuttosto stupida, immagino. Grazie ragazzi!
Johannes Pille,

3
Si noti che questo non corrisponderà a tutte le interruzioni di riga, ovvero quelle create sui sistemi Windows. Per catturarli, puoi usare invece il seguente RegEx/\r|\n|\r\n/
Toastrackenigma,

6
use \ R (che rappresenta qualsiasi sequenza di fine riga) stackoverflow.com/a/16274784/1491212
Armel Larcier,

435

La soluzione di Ben è accettabile, ma str_replace () è di gran lunga più veloce di preg_replace ()

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

Utilizzando meno potenza della CPU, riduce le emissioni mondiali di anidride carbonica.


5
Non riesco a credere che questa risposta non ottenga più credito. 100 pollici fino a questo su preg_replace ()
pimbrouwers il

62
IMPORTANTE: utilizzare i PREVENTIVI DOPPI intorno ai codici ritorno a capo e newline. Questi non verranno elaborati correttamente se si utilizzano virgolette singole!
bwright,

47
Pollice in alto -> "Utilizzando meno potenza della CPU, riduce le emissioni mondiali di anidride carbonica."
Jan

3
@Joeri: Quest'ultimo non verrà mai chiamato poiché sarebbe gestito dai primi due. È un codice ridondante.
nightfox89

4
@Joeri Considerando che str_replace rimuove tutte le occorrenze, \ r e \ n entrambi TUTTI verrebbero comunque rimossi?
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

È perché nl2br()non rimuove affatto le nuove linee.

Restituisce stringa con <br />o <br> inseriti prima di tutti a capo ( \r\n, \n\r, \ne \r).

Usa str_replaceinvece:

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

7

Puoi anche usare il trim PHP

Questa funzione restituisce una stringa con spazi bianchi eliminati dall'inizio e dalla fine di str. Senza il secondo parametro, trim () eliminerà questi caratteri:

  • "" (ASCII 32 (0x20)), uno spazio ordinario.
  • "\ t" (ASCII 9 (0x09)), una scheda.
  • "\ n" (ASCII 10 (0x0A)), una nuova riga (avanzamento riga).
  • "\ r" (ASCII 13 (0x0D)), un ritorno a capo.
  • "\ 0" (ASCII 0 (0x00)), il byte NUL.
  • "\ x0B" (ASCII 11 (0x0B)), una scheda verticale.

3
Questo avrà come target solo le nuove righe all'inizio e alla fine della stringa. I newline nel mezzo della stringa non saranno toccati.
mickmackusa,

6

Per funzionare correttamente anche su Windows, ti suggerisco di utilizzare

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

"\r\n"- per Windows, "\r"- per Mac e "\n"- per Linux


2
Mi spiace amico, ma anche se sono stato quello che lo ha chiesto nel '12, posso dirti con assoluta certezza che questo è ridondante. Chiediti quanto segue: Se tutti \re \nvengono rimossi nella stringa, perché non sarebbe il caso di quelli che si susseguono direttamente?
Johannes Pille,

Davvero, questa cosa ovvia non mi è venuta in mente ... Grazie :) Mi sono appena reso conto che ho avuto problemi con esso, ma era il contrario, l'ho usato \r\nsu Windows e non ha funzionato su Linux.
Ajjaah,

Bene, sto usando questa funzione per sostituire le interruzioni di riga con virgole, quindi un indirizzo è un testo a riga singola, quindi la sostituzione di \r\nFIRST sarebbe di aiuto, poiché ciò significa una virgola anziché due per ogni parte se tale interruzione di riga
Martin

@Martin Sì, hai ragione, ho appena realizzato lo stesso, quindi sostituiamo \r\nprima, quindi sostituiamo \re \n, ho modificato la mia risposta.
Ajjaah,

Questo è ancora ridondante, se hai intenzione di rimuovere tutto \re \r, non è necessario rimuoverlo \r\n, puoi str_replace(array("\r","\n"), "", $buffer);ottenere l' utente per ottenere lo stesso risultato.
Stramin

6

str_replace (PHP_EOL, null, $ str);


1
mentre questo può rispondere alla domanda. Si consiglia di spiegare un po 'della tua risposta.
Anirudh Sharma,

PHP_EOL non funziona sempre quando leggi la stringa. Lo fa quando li scrivi.
nightfox89,

Le risposte di solo codice hanno un valore basso su StackOverflow perché fanno molto poco per educare l'OP e i lettori futuri.
mickmackusa,

4

Qualcosa di più funzionale (facile da usare ovunque):

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

Anche usare PHP_EOL come parametro di sostituzione della ricerca è una buona idea! Complimenti.


1

Integrato alternativo: 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.

È lì per rimuovere le interruzioni di riga da diversi tipi di file di testo, ma non gestisce HTML.


0

Uso 3 righe per fare questo lavoro, quindi considera $ s come la tua "roba" ...

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