Itérer sur chaque ligne dans une chaîne de caractères en PHP
J'ai un formulaire qui permet à l'utilisateur de télécharger un fichier texte ou copier/coller le contenu du fichier dans un textarea. Je peux facilement la différence entre les deux et mis selon un, ils sont entrés dans une variable de type string, mais où dois-je aller à partir de là?
J'ai besoin de faire une itération sur chaque ligne de la chaîne (de préférence de ne pas se soucier des retours à la ligne sur des machines différentes), assurez-vous qu'il a exactement un jeton (pas d'espaces, des tabulations, des virgules, etc.), désinfecter les données, puis de générer une requête SQL basé sur toutes les lignes.
Je suis un assez bon programmeur, donc je sais que l'idée générale sur la façon de le faire, mais il a été si longtemps depuis que j'ai travaillé avec PHP que je suis à la recherche pour les mauvaises choses, et donc à venir avec des informations inutiles. La clé du problème, je vais avoir, c'est que je veux lire le contenu de la chaîne, ligne par ligne. Si c'était un fichier, il serait très facile.
Je recherche surtout utile pour les fonctions de PHP, pas un algorithme pour savoir comment faire. Des suggestions?
- Vous pouvez normaliser les retours à la ligne en premier. La méthode
s($myString)->normalizeLineEndings()
est disponible avec github.com/delight-im/PHP-Str (bibliothèque sous Licence MIT) qui a beaucoup d'autres outils de la chaîne des aides. Vous pouvez prendre un coup d'oeil au code source.
Vous devez vous connecter pour publier un commentaire.
preg_split
la variable contenant le texte, et de parcourir le tableau retourné:/((\r?\n)|(\r\n?))/
./((\r?\n)|(\n?\r))/
'/\r\n|\r|\n/'
?''
(la chaîne vide), qui consistera essentiellement à diviser la chaîne en caractères./[\r\n]+/
œuvres. J'ai ajouter l'avertissement que cela va correspondre à un seul ou de plusieurs retours à la ligne sans discernement, qui peut être indésirable. Bien sûr, bon retour à la ligne de fractionnement ne doit pas être fait à l'aide de regexp (pour des raisons de performances).Je voudrais proposer un significativement plus rapide (et de mémoire efficace) alternative:
strtok
plutôt quepreg_split
.De tester les performances, j'ai répété 100 fois sur un fichier de test avec 17 de milliers de lignes:
preg_split
a pris de 27,7 secondes, alors questrtok
a 1,4 secondes.Noter que bien que le
$separator
est défini comme"\r\n"
,strtok
seront séparés sur un des personnages - et de PHP4.1.0, sauter des lignes vides/jetons.Voir le strtok la saisie manuelle:
http://php.net/strtok
prey_split
niexplode
doit être utilisé pour la production structuré fragments de chaîne. C'est comme visant à une mouche avec un bazooka.strtok()
sur quelque chose d'autre à l'intérieur quiwhile
boucle de casser des choses. J'ai été également l'utiliser pour saisir tout dans une chaîne de caractères jusqu'au premier espace (stackoverflow.com/a/2477411/1767412) et m'a pris une minute pour comprendre pourquoi les choses n'allaient pas comme prévuexplode
a très bien fonctionné.Si vous devez gérer les retours à la ligne dans différents systèmes que vous pouvez simplement utiliser le PHP constante prédéfinie, PHP_EOL (http://php.net/manual/en/reserved.constants.php) et utilisez simplement exploser pour éviter la surcharge du moteur d'expression régulière.
PHP_EOL (string)
est La bonne "Fin De Ligne" symbole de ce plate-forme.C'est trop compliqué et laid, mais à mon avis, c'est le chemin à parcourir:
php://temp
pour stocker plus de données de fichier de disque temporaire.^ c'est une façon de briser les lignes correctement, multi-plateforme compatible avec
Regexp
🙂Kyril de réponse est meilleur en considérant que vous avez besoin pour être en mesure de gérer les retours à la ligne sur des machines différentes.
- Je utiliser ces beaucoup:
seul délimiteur.
Éventuels problèmes de mémoire avec
strtok
:Depuis l'une des solutions proposées utilise
strtok
, malheureusement, il n'a pas un potentiel problème de mémoire (si elle prétend être efficace en terme de mémoire). Lors de l'utilisation destrtok
selon le manuel, l':Il le fait par le chargement d'un fichier dans la mémoire. Si vous utilisez des fichiers volumineux, vous devez rincer si vous êtes fait une boucle dans le fichier.
Si vous êtes concernés par les fichiers physiques (par exemple. datamining):
Selon le manuel de l', pour l'upload de fichier, vous pouvez utiliser le
file
commande: