web-dev-qa-db-fra.com

Exploser PHP chaîne par nouvelle ligne

Simple, non? Eh bien, ça ne marche pas: - \

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

Meilleur entrainement

Comme indiqué dans le commentaire de la première réponse, la meilleure pratique consiste à utiliser la constante PHP PHP_EOL qui représente l'EOL du système actuel (End Of Line).

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

PHP fournit beaucoup d'autres constantes très utiles que vous pouvez utiliser pour rendre votre système de code indépendant, voir ce lien pour trouver des constantes de répertoires utiles et indépendantes du système.

Attention

Ces constantes rendent votre système de pages indépendant, mais vous pouvez rencontrer des problèmes lorsque vous passez d'un système à un autre lorsque vous utilisez les constantes avec des données stockées sur un autre système. Les constantes du nouveau système peuvent être différentes de celles du système précédent et les données stockées risquent de ne plus fonctionner. Alors, analysez complètement vos données avant de les stocker pour supprimer toutes les parties dépendant du système.

METTRE À JOUR

Le commentaire d'Andreas m'a fait comprendre que la solution "Best Practice" que je présente ici ne s'applique pas au cas d'utilisation décrit: l'EOL (PHP) du serveur n'a rien à voir avec l'EOL utilisé par le navigateur (quel que soit l'OS), mais cela (le navigateur) est l'endroit d'où provient la chaîne.

Utilisez donc la solution de @Alin_Purcaru ( three down ) pour couvrir toutes vos bases (et faire passer sa réponse au vote suivant):

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

Couvrir tous les cas. Ne comptez pas que votre contribution provient d'un environnement Windows.

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

ou

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

Essayez "\n\r" (guillemets doubles) ou juste "\n".

Si vous ne savez pas quel type d’EOL vous avez, lancez str_replace avant votre explosion, en remplaçant "\ n\r" par "\ n".

147
Select0r

Beaucoup de choses ici:

  • Vous devez utiliser des guillemets doubles et non des guillemets simples, sinon les caractères échappés ne seront pas échappés.
  • La séquence normale est \r\n, pas \n\r.
  • Selon la source, vous pouvez simplement obtenir \n sans le \r (ou même dans des cas inhabituels, éventuellement uniquement le \r)

Étant donné le dernier point, vous pouvez trouver preg_split() en utilisant toutes les variantes possibles, ce qui vous donnera un moyen plus fiable de fractionner les données que explode(). Mais vous pouvez également utiliser explode() avec seulement \n, puis utiliser trim() pour supprimer tous les caractères \r laissés en suspens.

13
Spudley

cette fonction php explose chaîne par newline

Attention : la nouvelle ligne dans Windows est\r\n et dans Linux et Unix est\n
cette fonction change toutes les nouvelles lignes en mode linux puis la scinde.
faites attention que les lignes vides seront ignorées

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

exemple

$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) );

sortie

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

essayer

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

Pour une nouvelle ligne, c'est juste

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

Pour une nouvelle ligne et un retour chariot (comme dans les fichiers Windows), c'est comme vous l'avez posté. Votre skuList est-il une zone de texte?

6
Andrew Sledge

Placez le \n entre guillemets:

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

Si je ne me trompe pas, les guillemets simples sont traités séparément comme \ et n.

4
Russell Dias

Pas parfait mais je pense que ce doit être le plus sûr. Ajouter nl2br :

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

Avez-vous essayé d'utiliser des guillemets doubles?

3
piddl0r

Essaye ça:

explode(PHP_EOF, $lines);
2
user3762492

Vous perdez des sauts de ligne lors de la publication dans les zones de saisie?
Ce qui fonctionne plus rapidement pour moi, c’est de copier, coller, tout type de données text ou Excel ou HTML ou type de nouvelle ligne et de le coller dans une zone de texte au lieu d’une zone de saisie.

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

dans le formulaire de réception du fichier: 

 $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
KarlosFontana

PHP_EOL est ostensiblement utilisé pour rechercher le caractère de nouvelle ligne de manière compatible avec plusieurs plates-formes, de sorte qu'il gère les problèmes de DOS/Unix.

Essaye ça:

$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
Radosav Leovac

Cette méthode fonctionne toujours pour moi:

$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
user2533777

Si quelqu'un d'autre a essayé mais que cela ne fonctionnait pas, ceci est un rappel que vous avez peut-être fait la même farce cérébrale que moi.

Avez-vous mysql échappé à la chaîne en premier? Dans ce cas, le caractère de nouvelle ligne n'est plus un caractère de nouvelle ligne.

Je n'ai rien fait pour éviter de l'analyser, juste adapté et explosé par '\ n' (littéralement anti-slash et n plutôt que par le caractère de nouvelle ligne.

0
user37150

Voici ce qui a fonctionné pour moi. Testé dans PHP 5.6 ainsi que 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);
0
codemonkey

Tout d’abord, je pense qu’il s’agit généralement de \r\n; deuxièmement, ils ne sont pas identiques sur tous les systèmes. Cela ne fonctionnera que sur les fenêtres. C'est un peu agaçant d'essayer de comprendre comment remplacer de nouvelles lignes car différents systèmes les traitent différemment (voir ici ). Vous pourriez avoir plus de chance avec seulement \n.

Aussi facile qu'il y paraît

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

Vous avez juste besoin de passer le texte exact "\ n" et écrire\n est utilisé directement comme séquence d'échappement. So "\\" pour passer une simple barre oblique inverse puis mettre "n"

0
Utsav Barnwal