Semplice vero? Bene, questo non funziona: - \
$skuList = explode('\n\r', $_POST['skuList']);
\r\nnon sono il contrario.
Semplice vero? Bene, questo non funziona: - \
$skuList = explode('\n\r', $_POST['skuList']);
\r\nnon sono il contrario.
Risposte:
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']);
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']);
\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']);
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".
/n/r? So che l'OP lo ha scritto ma l'eol di Windows corretto è\r\n
PHP_EOL.
explode("\n", str_replace("\r", '', $string));
Molte cose qui:
\r\nno \n\r.\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.
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
)
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?
Inserisci le \nvirgolette doppie:
explode("\n", $_POST['skuList']);
Tra virgolette singole, se non sbaglio, questo viene trattato come \e nseparatamente.
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"
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.
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.
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];
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'])));
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);
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);