@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):
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.
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\navant 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".
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.
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
)
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?
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"
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.
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.
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.
<textareaid="txtArea"name="txtArea"rows="40"cols="170"></textarea><br><inputtype="submit"value="split lines into array"/>
$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 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);
\r\n
ne sont pas l'inverse.Réponses:
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 .
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):
la source
Couvrez tous les cas. Ne comptez pas sur le fait que votre entrée provient d'un environnement Windows.
ou
la source
\r\n
. Pour éviter cela, utilisez:preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);
(notez que cela\r\n
devient inutile lorsque vous utilisez ce drapeau) ou mettez simplement le\r\n
avant le\r
:preg_split('/\r\n|\n|\r/', $_POST['skuList']);
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".
la source
/n/r
? Je sais que l'OP l'a écrit mais la bonne fenêtre eol est\r\n
PHP_EOL
.explode("\n", str_replace("\r", '', $string));
Beaucoup de choses ici:
\r\n
pas\n\r
.\n
sans\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 queexplode()
. Mais vous pouvez également utiliserexplode()
avec juste\n
, puis utilisertrim()
pour supprimer tous les\r
caractères qui restent.la source
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
exemple
production
la source
essayer
la source
Pour une nouvelle ligne, c'est juste
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?
la source
Placez le
\n
entre guillemets:explode("\n", $_POST['skuList']);
Dans les guillemets simples, si je ne me trompe pas, cela est traité comme
\
etn
séparément.la source
Avez-vous essayé d'utiliser des guillemets doubles?
la source
Pas parfait mais je pense que ça doit être le plus sûr. Ajouter nl2br :
la source
Essaye ça:
la source
Aussi simple qu'il y paraît
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"
la source
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
.la source
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.
la source
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.
dans le formulaire de réception du fichier:
la source
Cette méthode fonctionne toujours pour moi:
la source
Essaye ça:
la source
Vous pouvez l'essayer avec regex:
$skuList = explode('/[\r\n]+/', $_POST['skuList']);
la source
Voici ce qui a fonctionné pour moi. Testé en PHP 5.6 ainsi qu'en PHP 7.0:
la source