150 votes

Itérer sur chaque ligne d'une chaîne 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, ce serait facile.

Je recherche surtout utile pour les fonctions de PHP, pas un algorithme pour savoir comment faire. Toutes les suggestions?

212voto

Kyril Points 1116

preg_split la variable contenant le texte et parcourez le tableau retourné:

 foreach(preg_split("/((\r?\n)|(\r\n?))/", $subject) as $line){
    // do stuff with $line
} 
 

180voto

Erwin Wessels Points 546

Je voudrais proposer une nettement plus rapide (et de mémoire efficace) alternative: strtok plutôt que d' preg_split.

$separator = "\r\n";
$line = strtok($subject, $separator);

while ($line !== false) {
    # do something with $line
    $line = strtok( $separator );
}

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, tandis que d' strtok a 1,4 secondes.

Notez que, bien que l' $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 la strtok la saisie manuelle: http://www.php.net/manual/function.strtok.php

101voto

FerCa Points 969

Si vous avez besoin de gérer les sauts de ligne dans différents systèmes, vous pouvez simplement utiliser la constante PHP_EOL (http://php.net/manual/en/reserved.constants.php) prédéfinie et simplement utiliser explode pour éviter la surcharge du moteur d'expressions régulières .

 $lines = explode(PHP_EOL, $subject);
 

24voto

pguardiario Points 19925

C'est trop compliqué et moche, mais à mon avis c'est la voie à suivre:

 $fp = fopen("php://memory", 'r+');
fputs($fp, $data);
rewind($fp);
while($line = fgets($fp)){
  // deal with $line
}
fclose($fp);
 

4voto

Joe Kiley Points 313

La réponse de Kyril est la meilleure compte tenu du fait que vous devez être capable de gérer les nouvelles lignes sur différentes machines.

"Je cherche surtout des fonctions PHP utiles, pas un algorithme pour le faire. Des suggestions?"

J'utilise beaucoup ces:

explode () peut être utilisé pour scinder une chaîne de caractères dans un tableau, à partir d'un seul délimiteur.

implode () est le pendant de explode, pour passer du tableau à la chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X