Décomposer la chaîne PHP par une nouvelle ligne


253

C'est simple, non? Eh bien, cela ne fonctionne pas: - \

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

28
Les guillemets simples signifient "ne pas analyser cette chaîne". La réponse de @ Select0r est probablement ce que vous recherchez.
Ryan Kinal

3
doublon possible de la façon de supprimer les nouvelles lignes et les retours de la chaîne php? qui était déjà un doublon de Supprimer de manière fiable les newslines de la chaîne et quelques autres . Utilisez la fonction de recherche frigging avant de poser des questions s'il vous plaît!
Gordon

1
@Gordon: Ha, j'ai vu ce que le colonel Shrapnel a dit dans cette autre question. Un peu triste en fait. Ajout de mon vote serré cependant.
BoltClock

9
En plus des guillemets simples publiés mentionnés par d'autres, les paires CRLF \r\nne sont pas l'inverse.
Powerlord

1
Essayez de vous rappeler que: \ R etur \ N
l00k

Réponses:


410

Meilleur entrainement

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

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

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

avertissement

Ces constantes rendent votre système de pages indépendant, mais vous pouvez rencontrer des problèmes lors du passage 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 peuvent ne plus fonctionner. Analysez donc complètement vos données avant de les stocker pour supprimer toutes les parties dépendantes du système.

METTRE À JOUR

Le commentaire d'Andreas m'a fait réaliser que la solution `` Best Practice '' que je présente ici ne s'applique pas au cas d'utilisation décrit: l'EOL du serveur (PHP) n'a rien à voir avec l'EOL que le navigateur (n'importe quel OS) utilise, mais c'est (le navigateur) d'où vient la chaîne.

Veuillez donc utiliser la solution de @Alin_Purcaru ( trois vers le bas ) pour couvrir toutes vos bases (et voter positivement sa réponse):

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

5
Ceci est une nouvelle réponse mais c'est probablement la meilleure et à juste titre la réponse acceptée
frazras

C'est étrange, car c'est la façon dont PHP veut que vous le fassiez :) Pouvez-vous me donner plus de détails sur votre version OS et PHP, peut-être un morceau de code sur PasteBin ou qch. similaire?
Larzan

16
Vous ne pouvez pas utiliser PHP_EOL car le système et la source d'entrée n'ont rien à voir l'un avec l'autre. Si l'utilisateur met de nouvelles lignes dans Windows et que PHP fonctionne sous Linux, le résultat peut être cassé.
barell

1
@barell exactement, c'est la situation que je décris dans la partie 'avertissement';) La question n'a pas explicitement déclaré qu'il s'agit d'une ancienne entrée stockée dans la base de données. Veuillez lire la partie «avertissement» et vous verrez que je couvre cette situation là-bas.
Larzan

7
Cette réponse est tout simplement fausse pour ce cas d'utilisation. N'utilisez pas la constante PHP_EOL dans ce cas car la source d'entrée (par exemple le navigateur de l'utilisateur) n'est certainement pas votre système. Utilisez une solution qui prend en charge toutes les différentes fins de ligne (réponse d'Alin Purcaru).
Andreas

241

Couvrez tous les cas. Ne comptez pas sur le fait que votre entrée provient d'un environnement Windows.

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

ou

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

21
Cela se traduira par des éléments de tableau vides si l'ol est \r\n. Pour éviter cela, utilisez: preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);(notez que cela \r\ndevient inutile lorsque vous utilisez ce drapeau) ou mettez simplement le \r\n avant le \r:preg_split('/\r\n|\n|\r/', $_POST['skuList']);
webbiedave

2
@webbiedave PREG_SPLIT_NO_EMPTY est sympa, MAIS il supprimera les lignes vides. Cela peut être souhaitable ou non.
jms

Ce modèle correspondrait à chaque lettre pour moi, car il aboutit au succès même si rien n'est présent. "?" signifie 0 ou une fois, il est donc possible qu'il corresponde même si \ r et \ n ne sont pas présents. Vous dites "fixe" mais je ne vois pas cela. J'ai utilisé / (\ r | \ n) + / à la place.
Rolf

1
@Rolf Il semble que j'ai fait un montage à la hâte. Corrigé maintenant. Ce que vous devez utiliser dépend de si vous voulez ou non les lignes vides dans la sortie. L'option de ma réponse renvoie également des lignes vides.
Alin Purcaru

3
@AlinPurcaru Pouvez-vous préciser dans la réponse qui (les deux, ni l'un ni l'autre?) Retournera des blancs et lequel ne le sera pas?
Patrick

150

Essayez "\n\r"(guillemets doubles) ou tout simplement "\n".

Si vous n'êtes pas sûr du type d'EOL dont vous disposez, exécutez un str_replace avant votre explosion, en remplaçant "\ n \ r" par "\ n".


52
Les guillemets simples en PHP signifient "ne pas analyser cette chaîne". Cela signifie que vos caractères de contrôle ne sont pas analysés, ils sont considérés comme littéraux (pas un saut de ligne et un retour chariot, mais un littéral réel "\ n \ r"). L'utilisation de guillemets doubles signifie «analyser cette chaîne», et donc vos caractères de contrôle seront analysés. +1
Ryan Kinal

17
/n/r? Je sais que l'OP l'a écrit mais la bonne fenêtre eol est\r\n
webbiedave

20
Considérez le PHP fin de ligne constante: PHP_EOL.
Daniel W.

Salut tout le monde, c'est définitivement la bonne réponse! Je me demande pourquoi la réponse de @Alin Purcaru a obtenu 44 votes .. C'est faux !!! Cela ne fonctionne pas toujours correctement bien qu'il semble que cela fasse le travail .. Alors voici mon commentaire pour quiconque collant sur la même chose
Rafik Bari

3
Ignorez simplement le \ r, le dernier OS à l'utiliser sans \ n était OS9 ( en.wikipedia.org/wiki/Newline#Representations ). Par conséquent, cela vous donnera les meilleurs résultats:explode("\n", str_replace("\r", '', $string));
DanielM

15

Beaucoup de choses ici:

  • Vous devez utiliser des guillemets doubles, pas des guillemets simples, sinon les caractères échappés ne seront pas échappés.
  • La séquence normale ne l'est \r\npas \n\r.
  • Selon la source, vous pouvez être juste obtenir \nsans \r(ou même dans des cas exceptionnels, peut - être juste le \r)

Compte tenu du dernier point, vous trouverez peut-être que l' preg_split()utilisation de toutes les variantes possibles vous donnera un moyen plus fiable de fractionner les données que explode(). Mais vous pouvez également utiliser explode()avec juste \n, puis utiliser trim()pour supprimer tous les \rcaractères qui restent.


Très bonne réponse. Succinct, couvre tout. Merci!
Kosta Kontos

11

cette fonction php explose la chaîne par newline

Attention : nouvelle ligne dans Windows est \ r \ n et sous Linux et Unix est \ n
cette fonction change toutes les nouvelles lignes en mode linux puis divise-la.
attention aux lignes vides qui 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) );

production

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


6

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 publié. Votre skuList est-elle une zone de texte?


4

Placez le \nentre guillemets:

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

Dans les guillemets simples, si je ne me trompe pas, cela est traité comme \et nséparément.


3

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


3

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

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


1

Aussi simple qu'il y paraît

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

Il vous suffit de passer le texte exact "\ n" et l'écriture \ n directement est utilisée comme séquence d'échappement. Donc "\\" pour passer une simple barre oblique vers l'arrière puis mettre "n"


0

Tout d'abord, je pense que ce n'est généralement pas le cas \r\n, deuxièmement, ce ne sont pas les mêmes sur tous les systèmes. Cela ne fonctionnera que sur les fenêtres. C'est un peu ennuyeux 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 juste \n.


0

Si quelqu'un d'autre a essayé cela mais cela n'a pas fonctionné, c'est un rappel que vous pourriez avoir fait le même pet cérébral que moi.

Avez-vous d'abord échappé à la chaîne mysql? 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 barre oblique inverse et n plutôt que caractère de nouvelle ligne réel.


3
faire toutes les manipulations de cordes après l'évasion mysql n'a absolument aucun sens
Your Common Sense

0

Vous perdez des sauts de ligne suite à la publication à partir des zones de texte d'entrée?
Ce qui fonctionne plus rapidement pour moi, c'est de copier-coller n'importe quel texte ou type de tableau Excel ou HTML ou type de nouvelle ligne et de le coller dans une zone de texte au lieu d'une boîte de saisie: cela garde les sauts de ligne intacts dans le POST.

 <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

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

PHP_EOL est ostensiblement utilisé pour trouver le caractère de nouvelle ligne d'une manière compatible avec plusieurs plates-formes, il gère donc les problèmes 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

Vous pouvez l'essayer avec regex:

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


0

Voici ce qui a fonctionné pour moi. Testé en PHP 5.6 ainsi qu'en 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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.