Esplodi la stringa PHP con una nuova riga


253

Semplice vero? Bene, questo non funziona: - \

$skuList = explode('\n\r', $_POST['skuList']);

28
Le virgolette singole significano "non analizzare questa stringa". La risposta di @ Select0r è probabilmente ciò che stai cercando.
Ryan Kinal,

3
possibile duplicato di come rimuovere nuove righe e ritorni dalla stringa php? che era già un duplicato di rimuovere in modo affidabile le notizie dalla stringa e da alcuni altri . Usa la frigging funzione di ricerca prima di porre domande per favore!
Gordon,

1
@Gordon: Ah, ho visto cosa ha detto il Col. Shrapnel in quell'altra domanda. Un po 'triste in realtà. Aggiungendo il mio voto vicino però.
BoltClock

9
Oltre alle virgolette singole menzionate da altri, le coppie CRLF \r\nnon sono il contrario.
Powerlord,

1
Cerca di ricordare che: \ R etur \ N
lkk

Risposte:


410

La migliore pratica

Come menzionato nel commento alla prima risposta, la migliore pratica è usare la costante PHP PHP_EOL che rappresenta l'EOL ( End Of Line ) del sistema attuale .

$skuList = explode(PHP_EOL, $_POST['skuList']);

PHP fornisce molte altre costanti molto utili che puoi usare per rendere il tuo sistema di codice indipendente, vedi questo link per trovare costanti di directory utili e indipendenti dal sistema.

avvertimento

Queste costanti rendono il tuo sistema di pagine indipendente, ma potresti incorrere in problemi quando ti sposti da un sistema a un altro quando usi le costanti con i dati memorizzati su un altro sistema. Le costanti del nuovo sistema potrebbero essere diverse da quelle del sistema precedente e i dati memorizzati potrebbero non funzionare più. Quindi analizza completamente i tuoi dati prima di archiviarli per rimuovere eventuali parti dipendenti dal sistema.

AGGIORNARE

Il commento di Andreas mi ha fatto capire che la soluzione "Best Practice" che presento qui non si applica al caso d'uso descritto: l'EOL (PHP) del server non ha nulla a che fare con l'EOL che il browser (qualsiasi sistema operativo) sta usando, ma quello (il browser) è da dove proviene la stringa.

Quindi usa la soluzione di @Alin_Purcaru ( tre in basso ) per coprire tutte le tue basi (e vota la sua risposta):

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);

5
Questa è una nuova risposta, ma è probabilmente la migliore e giustamente la risposta accettata
frazras

È strano, come è il modo in cui PHP vuole che tu lo faccia :) Puoi darmi maggiori dettagli sul tuo sistema operativo e sulla tua versione di PHP, forse un pezzo di codice su PasteBin o sth. simile?
Larzan,

16
Non puoi usare PHP_EOL perché il sistema e la sorgente di input non hanno nulla a che fare l'uno con l'altro. Se l'utente inserisce nuove righe in Windows e PHP è in esecuzione su Linux, il risultato potrebbe essere interrotto.
barella il

1
@barell esattamente, questa è la situazione che descrivo nella parte 'warning';) La domanda non ha dichiarato esplicitamente che si tratta di un vecchio input memorizzato nel database. Si prega di leggere la parte di "avvertimento" e vedrete che ho coperto quella situazione lì.
Larzan,

7
Questa risposta è sbagliata per questo caso d'uso. In questo caso non utilizzare la costante PHP_EOL poiché la sorgente di input (ad es. Il browser dell'utente) non è sicuramente il tuo sistema. Utilizzare una soluzione che si occupi di tutte le diverse terminazioni di linea (risposta di Alin Purcaru).
Andreas,

241

Copri tutti i casi. Non fare affidamento sul fatto che l'input proviene da un ambiente Windows.

$skuList = preg_split("/\\r\\n|\\r|\\n/", $_POST['skuList']);

o

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);

21
Ciò comporterà elementi dell'array vuoti se l'eol lo è \r\n. Per evitarlo, usa: preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);(nota che \r\ndiventa superfluo quando usi quella bandiera) o semplicemente metti il \r\n prima il \r:preg_split('/\r\n|\n|\r/', $_POST['skuList']);
webbiedave

2
@webbiedave PREG_SPLIT_NO_EMPTY è carino, MA eliminerà le righe vuote. Questo può o meno essere desiderabile.
jms

Questo modello corrisponderebbe a tutte le lettere per me, perché si traduce in successo anche se non è presente nulla. "?" significa 0 o una volta, quindi è possibile che corrisponda anche se entrambi \ r e \ n non sono presenti. Dici "riparato" ma non lo vedo. Ho usato / (\ r | \ n) + / invece.
Rolf,

1
@Rolf Sembra che abbia fatto una modifica in fretta. Corretto adesso. Quello che dovresti usare dipende dal fatto che tu voglia o meno le righe vuote nell'output. L'opzione dalla mia risposta restituisce anche righe vuote.
Alin Purcaru,

3
@AlinPurcaru Puoi chiarire nella risposta quale (entrambi, nessuno dei due?) Restituirà spazi vuoti e quali no?
Patrick,

150

Prova "\n\r"(virgolette doppie) o solo "\n".

Se non sei sicuro di quale tipo di EOL hai, esegui str_replace prima dell'esplosione, sostituendo "\ n \ r" con "\ n".


52
Le virgolette singole in PHP significano "non analizzare questa stringa". Ciò significa che i tuoi personaggi di controllo non vengono analizzati, vengono considerati letterali (non un'interruzione di riga e un ritorno a capo, ma effettivi, letterali '\ n \ r'). L'uso delle virgolette doppie significa "analizzare questa stringa", e quindi i tuoi caratteri di controllo verranno analizzati. +1
Ryan Kinal,

17
/n/r? So che l'OP lo ha scritto ma l'eol di Windows corretto è\r\n
webbiedave

20
Si consideri il PHP fine linea costante: PHP_EOL.
Daniel W.

Ciao a tutti, questa è sicuramente la risposta giusta! Mi chiedo perché @Alin Purcaru abbia ottenuto 44 voti .. È sbagliato !!! Non funziona sempre correttamente, anche se sembra che faccia il lavoro .. Quindi, ecco il mio commento per chiunque rimanga bloccato sulla stessa cosa
Rafik Bari,

3
Ignora semplicemente \ r, l'ultimo sistema operativo per usarlo senza \ n era OS9 ( en.wikipedia.org/wiki/Newline#Representations ). Pertanto questo ti darà i migliori risultati:explode("\n", str_replace("\r", '', $string));
DanielM

15

Molte cose qui:

  • È necessario utilizzare virgolette doppie, non virgolette singole, altrimenti i caratteri di escape non verranno salvati.
  • La sequenza normale è \r\nno \n\r.
  • A seconda della fonte, potresti essere \nsenza \r(o anche in casi insoliti, forse solo \r)

Dato l'ultimo punto, potresti scoprire che l' preg_split()utilizzo di tutte le possibili varianti ti darà un modo più affidabile di dividere i dati rispetto a explode(). Ma in alternativa puoi usare explode()solo \n, e quindi usare trim()per rimuovere tutti i \rpersonaggi che rimangono in giro.


Bella risposta. Succinto, copre tutto. Grazie!
Kosta Kontos,

11

questa funzione php esplode la stringa da newline

Attenzione : la nuova linea in Windows è \ r \ n e in Linux e Unix è \ n
questa funzione cambia tutte le nuove linee in modalità linux quindi la divide.
prestare attenzione che le righe vuote verranno ignorate

function splitNewLine($text) {
    $code=preg_replace('/\n$/','',preg_replace('/^\n/','',preg_replace('/[\r\n]+/',"\n",$text)));
    return explode("\n",$code);
}

esempio

$a="\r\n\r\n\n\n\r\rsalam\r\nman khobam\rto chi\n\rche khabar\n\r\n\n\r\r\n\nbashe baba raftam\r\n\r\n\r\n\r\n";
print_r( splitNewLine($a) );

produzione

Array
(
    [0] => salam
    [1] => man khobam
    [2] => to chi
    [3] => che khabar
    [4] => bashe baba raftam
)


6

Per una nuova linea, è solo

$list = explode("\n", $text);

Per una nuova riga e ritorno a capo (come nei file Windows), è come hai pubblicato. La tua skuList è un'area di testo?


4

Inserisci le \nvirgolette doppie:

explode("\n", $_POST['skuList']);

Tra virgolette singole, se non sbaglio, questo viene trattato come \e nseparatamente.



3

Non perfetto ma penso che debba essere più sicuro. Aggiungi nl2br :

$skuList = explode('<br />', nl2br($_POST['skuList']));


1

Facile come sembra

$skuList = explode('\\n', $_POST['skuList']);

Devi solo passare il testo esatto "\ n" e scrivere \ n direttamente viene utilizzato come sequenza di escape. Quindi "\\" passa una semplice barra rovesciata e poi inserisci "n"


0

Prima di tutto, penso che di solito \r\n, in secondo luogo, non siano gli stessi su tutti i sistemi. Funzionerà solo su Windows. È un po 'noioso cercare di capire come sostituire le nuove linee perché diversi sistemi le trattano in modo diverso (vedi qui ). Potresti avere più fortuna con Just \n.


0

Se qualcun altro ha provato questo ma non ha funzionato, questo è un promemoria che potresti aver fatto la stessa scoreggia cerebrale di I.

MySql è uscito prima dalla stringa? In questo caso il carattere di nuova riga non è più un carattere di nuova riga.

Non ho fatto nulla per evitare di analizzarlo, semplicemente adattato ed esploso da '\ n' (letteralmente barra rovesciata e n piuttosto che dal carattere di nuova riga reale.


3
fare qualsiasi manipolazione di stringhe dopo la fuga di mysql non ha assolutamente senso
Your Common Sense

0

Perdere interruzioni di riga dalla pubblicazione dalle caselle di testo di input?
Ciò che funziona più velocemente per me è copiare incollare qualsiasi tipo di testo o tabella Excel o HTML o tipo di nuova riga di dati e incollarli in un'area di testo anziché in una casella di input: questo mantiene intatte le interruzioni di riga nel POST.

 <textarea  id="txtArea" name="txtArea" rows="40" cols="170"></textarea>
 <br>
 <input type="submit" value="split lines into array" /> 

nel modulo che riceve il file:

 $txtArea ='';  
 $txtArea = $_POST['txtArea'];  
 $TA = $_POST['txtArea'];  
 $string = $TA;  
 $array = preg_split ('/$\R?^/m', $string); 
// or any of these: 
// $array = explode(PHP_EOL,$string);  
// $array = explode("\n", $txtArea); 
 echo "<br>A0: ".$array[0];
 echo "<br>A1: ".@$array[1];
 echo "<br>A2: ".@$array[2];

0

Questo metodo funziona sempre per me:

$uniquepattern="@#$;?:~#abcz"//Any set of characters which you dont expect to be present in user input $_POST['skuList'] better use atleast 32 charecters.
$skuList=explode($uniquepattern,str_replace("\r","",str_replace("\n",$uniquepattern,$_POST['skuList'])));

0

PHP_EOL è apparentemente utilizzato per trovare il carattere di nuova riga in modo compatibile con più piattaforme, quindi gestisce i problemi DOS / Unix.

Prova questo:

$myString = "Prepare yourself to be caught
You in the hood gettin' shot
We going throw hell of blows
got my whole frame froze";

$myArray = explode(PHP_EOL, $myString);

print_r($myArray);

0

Puoi provarlo con regex:

$skuList = explode('/[\r\n]+/', $_POST['skuList']);


0

Ecco cosa ha funzionato per me. Testato in PHP 5.6 e PHP 7.0:

    $skuList = str_replace("\\r\\n", "\n", $_POST['skuList']);
    $skuList = str_replace("\\n\\r", "\n", $skuList);

    $skuList = preg_split("/\n/", $skuList);
    print_r($skuList);
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.