2010-10-22 20 views
170

Semplice, giusto? Beh, questo non sta funzionando: - \Esplodi stringa PHP con nuova riga

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

virgolette singole significano "non analizzare questa stringa". @ La risposta di Select0r è probabilmente quella che stai cercando. –

+2

possibile duplicato di [come rimuovere nuove righe e restituisce da stringa php?] (Http://stackoverflow.com/questions/3986299/how-to-remove-new-lines-and-returns-from-php-string) che era già un duplicato di [Rimozione affidabile delle notizie dalla stringa] (http://stackoverflow.com/questions/2274506/reliably-remove-newlines-from-string) e [altre] (http://stackoverflow.com/ ricerca? q = rimuovere + newline + da + stringa + PHP). Utilizzare la funzione di ricerca frigging prima di fare domande per favore! – Gordon

+1

@Gordon: Ha, ho visto cosa ha detto Col. Shrapnel in quell'altra domanda. Un pò triste in realtà. Aggiungendo comunque il mio voto ravvicinato. – BoltClock

risposta

231

Best Practice

Come accennato nel commento alla prima risposta, la pratica migliore è quella di utilizzare la costante PHP PHP_EOL che rappresenta EOL del sistema attuale (End Of Line).

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

PHP fornisce un sacco di altri molto useful constants che è possibile utilizzare per rendere il sistema di codice autonomo, vedere this link di trovare utili e di sistema costanti directory indipendenti.

Attenzione

Queste costanti rendere il vostro sistema pagina indipendenti, ma si potrebbe incorrere in problemi quando si passa da un sistema all'altro quando si utilizzano le costanti con i dati memorizzati su un altro sistema. Le costanti del nuovo sistema potrebbero essere diverse dal sistema precedente e i dati memorizzati potrebbero non funzionare più.Quindi analizza completamente i dati prima di memorizzarli per rimuovere le parti dipendenti dal sistema.

UPDATE

commento mi ha fatto capire che la '

Andreas soluzione Best Practice' che presento qui non si applica al caso d'uso descritte: EOL del server (PHP) non ha nulla a che fare con l'EOL utilizzato dal browser (qualsiasi sistema operativo), ma che (il browser) è da dove proviene la stringa.

Così si prega di utilizzare la soluzione da @Alin_Purcaru (three down) per coprire tutte le basi (e upvote 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

+3

Questo non ha funzionato per me – dspacejs

+0

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

3

per una nuova linea, è solo

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

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

+2

Richiede doppi apici. – meagar

143

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

Se non siete sicuri di quale tipo di EOL avete, eseguire uno str_replace prima di esplodere, sostituendo "\ n \ r" con "\ n".

+48

Le virgolette singole in PHP significano "non analizzare questa stringa". Ciò significa che i tuoi caratteri di controllo non vengono analizzati, vengono presi come valori letterali (non un'interruzione di riga e un ritorno a capo, ma un vero e proprio letterale '\ n \ r'). Usare le virgolette doppie significa "analizzare questa stringa", e quindi i caratteri di controllo verranno analizzati. +1 –

+17

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

+19

Considera la costante PHP di fine linea *:' PHP_EOL'. – DanFromGermany

153

Coprire tutti i casi. Non fare affidamento sul fatto che il tuo input provenga da un ambiente Windows.

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

o

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

Ciò comporterà elementi di array vuoti se eol è '\ r \ n '. Per evitare ciò, utilizzare: 'preg_split ('/ \ n | \ r /', $ _POST ['skuList'], -1, PREG_SPLIT_NO_EMPTY);' (notare che '\ r \ n' diventa inutile quando si usa quel flag) o semplicemente mettere il '\ r \ n' * prima di * il' \ r': 'preg_split ('/ \ r \ n | \ n | \ r /', $ _POST ['skuList']);' – webbiedave

+0

@ webbiedave fisso –

+1

@webbiedave PREG_SPLIT_NO_EMPTY è bello, ma cancellerà le linee vuote. Questo può o non può essere desiderabile. – jms

3

Hai provato a usare le virgolette?

4

Posizionare il \n tra virgolette:

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

tra virgolette singole, se non mi sbaglio, questo viene trattato come \ e n separatamente.

0

Prima di tutto, penso che sia solito \r\n, secondo di tutti, coloro che non sono la stessa su tutti i sistemi. Funzionerà solo su Windows. È piuttosto fastidioso cercare di capire come sostituire le nuove linee perché i diversi sistemi li trattano in modo diverso (vedere here). Potresti avere più fortuna con solo \n.

12

Un sacco di cose qui:

  • È necessario usare le virgolette, virgolette non singole, altrimenti i caratteri di escape non saranno sfuggiti.
  • La sequenza normale è \r\n, non \n\r.
  • A seconda della sorgente, si può solo essere sempre \n senza il \r (o anche in casi insoliti, forse solo il \r)

Dato l'ultimo punto, si può trovare preg_split() utilizzando tutte le possibili varianti darti un modo più affidabile di dividere i dati rispetto a explode(). Ma in alternativa si può usare explode() con solo \n, e quindi utilizzare trim() per rimuovere eventuali \r caratteri che vengono lasciati in giro.

+0

Molto felice qualcuno ha sottolineato che è \ r \ n e non \ n \ r. –

0

Se qualcun altro ha provato questo, ma non funzionava, questo è un ricordo che si potrebbe avere fatto lo stesso scoreggia cervello come I.

Avete mysql sfuggito la stringa prima? In questo caso, il carattere di nuova riga non è più un carattere di nuova riga.

non ho fatto nulla per evitare l'analisi, solo adattato e 'esplosa '\ n'(letteralmente backslash e n piuttosto che vero carattere di nuova riga.

+3

fare qualsiasi manipolazione di stringhe dopo mysql escape non ha assolutamente senso –

7

provare

explode(chr(10), $_POST['skuList']); 
0

Perdere interruzioni di riga dalla pubblicazione di caselle di testo di input Ciò che funziona più velocemente per me è copiare il testo incollato o il tipo di tabella Excel o HTML o il tipo newline di dati e incollarlo in un'area di testo anziché in una casella di input: mantiene le interruzioni di riga intatte in il POST.

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

sotto forma di file di ricezione:

$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: "[email protected]$array[1]; 
echo "<br>A2: "[email protected]$array[2]; 
10

questa funzione PHP explode stringa a capo

Attenzione: nuova linea in di Windows è \ r \ n e in Linux e Unix è \ n
questa funzione modifica tutte le nuove righe in linux quindi lo divide.
prestare attenzione che le linee 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)); 

uscita

Array 
(
    [0] => salam 
    [1] => man khobam 
    [2] => to chi 
    [3] => che khabar 
    [4] => bashe baba raftam 
) 
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']))); 
1

Prova questo:

explode(PHP_EOF, $lines); 
+0

Sicuramente PHP_EOL piuttosto che EOF – Ewen

0

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

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

PHP_EOL è apparentemente usato per trovare il carattere di nuova riga in modo cross-platform compatibile, in modo che 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);