Le traitement des fichiers et des chaînes de caractères

Vous trouverez dans cette page, des scripts qui montrent comment on manipule les fichiers et les chaînes de caractères en PHP. les fonctions pour l'ouverture d'un fichier en lecture ou en écriture,, ont assez souvent les mêmes noms et la même syntaxe qu'en c. Pour chaque exemple, je donne la syntaxe de la fonction utilisée.

Vous pouvez lire le script de l'exemple, que j'ai placé dans un fichier.txt, qui correspont au fichier .php de même nom.

Traitement des fichiers

On trouve comme en C, les fonctions fopen, fgetc, fgets, fputc, fputs, fseek, fclose...

fopen($fichier, $mode)

Voici un script dans lequel on utilise fopen avec le mode "w" pour ouvrir le fichier texte "nomfichier.txt" en écriture. Dans l'exemple suivant, on y écrit 2 lignes, puis on utilise fopen avec le mode "r" pour ouvrir "nomfichier.txt" en lecture.

fopen.txt : script du fichier fopen.php

Si vous avez regardé les instructions dans le script de l'exemple, vous comprendrez facilement les résultats de son exécution. Voici ces résultats de l'exécution du fichier fopen.php :

 ligne 1
ligne 2

Vous aurez remarqué, dans cet exemple, l'utilisation de la fonction fputs, pour écrire des lignes dans "nomfichier.txt", et de la fonction fgets pour récupérer des lignes de "nomfichier" fclose permet de refermer le fichier "nomfichier", ouvert en écriture, puis en lecture.

N'oubliez pas de traiter les exceptions, au cas où "nomfichier.txt" ne pouvait pas être ouvert.

Les expressions régulières et le traitement des chaînes de caractères

Le langage PHP offre de grandes possibilités, comme le langage PERL, pour analyser et traiter les chaînes et les tableaux.

Les opérations sur les chaînes de caractères et la souplesse du PHP pour reconnaître les types

Il y a 2 sortes d'écriture pour les chaînes :

"une chaîne entre guillemets, avec éventuellement des variables $var dans la chaîne"

'une chaîne entre apostrophes, avec éventuellement des variables $var dans la chaîne'

La différence entre les 2 écritures, est que les variables contenues dans une chaîne placée entre guillemets, sont remplacées par leur valeur, contrairement aux chaînes placées entre apostrophes.

La concaténation des chaînes est obtenue très simplement en utilisant l'opérateur "."

Exemple :

"Je chante".' soir'." et matin\n"

Le caractère "\" est comme en C, un caractère d'échappement, que l'on utilise pour indiquer des caractères de contrôle, comme \n, \t... ou pour écrire des caractères interdits, comme \" ou \' (respectivement dans une chaine entre guillemets, ou pour une chaîne entre apostrophes)

Le PHP est très souple pour transtyper les expressions suivant leur contexte.

Le type d'une variable est reconnu lors de son affectation, et il peut changer, selon les opérations que l'on fait. Par exemple, l'instruction $var="10"; affecte la chaîne "10" à la variable $var, qui a donc le type "string".

L'instruction $var=$var."2"; affecte la chaîne "12" à la variable $var (concaténation de 2 chaînes)

L'instruction $var=$var*2; affecte la valeur 24 a la chaîne $var, qui devient un entier (integer)

$var=$var."5"; affecte la chaîne "245" à $var, qui retrouve le type "string".

Enfin, l'instruction $var=$var/10; affecte la valeur 24.5 à $var, qui devient un "double". Vous pouvez faire des essais par vous-même, et vérifier quel est le type de $var, en utilisant la fonction gettype($var), qui renvoie une chaîne, qui contient le nom du type ("integer" ou "double" ou "string" ou "array")

Cette souplesse pourra faciliter les calculs, mais il ne faut pas en abuser, car elle est souvent à l'origine d'erreur.

On peut utiliser la fonction settype($var,"type") où "type" est le type choisi parmi "integer", "double"... Pour plus de détails, consultez le lien :

 Lien externe : résumé sur les différences entre les langages C, perl et PHP, pour la déclaration du type d'une variable

Les expressions régulières

Pour rechercher une sous-chaîne dans une chaîne, on peut utiliser des fonctions comme strstr, strpos... Mais il y a bien plus de possibilités avec le PHP, par rapport au langage C, pour traiter des chaînes ou des tableaux de hachage, utiliser des "expressions régulières"... (comme dans le langage PERL)

J'insiste ici sur l'intérêt que l'on a, en PHP, d'utiliser les outils de traitement des modèles ou "pattern", qui permettent de rechercher et d'extraire des suites de caractères dans des chaînes.

Si vous connaissez le langage PERL, ou des applications comme grep.exe pour DOS, vous n'aurez aucune difficulté avec les "modèles".

Un "modèle" ou "motif" d'expression régulière, est un ensemble d'opérateurs, de symboles, de méta-caractères et de caractères, qui permet d'indiquer ce que l'on veut rechercher dans une chaîne de caractères ou dans un ensemble de ligne d'un fichier texte. On peut considèrer qu'un "modèle" est une sorte de formule mathématique avec des opérateurs, dont on se fera une bonne idée de son action, en la lisant à haute voix. Voici un exemple, pour plus de clarté :

Le motif "<h[1-6]>" se lit "rechercher toutes les occurrences de "<h" suivi d'un chiffre entre 1 et 6 et suivi du caractère ">" Ce motif permettra donc de rechercher toutes les balises de titre dans une chaîne cible.

Voici un autre exemple : #\d# se lit "rechercher s'il y a des chiffres 0 ou 1... ou 9, dans une chaîne de caractères. Ce modèle s'écrit aussi : #[0-9]# qui signifie reconnaître le caractère 0 ou le caractère 1... ou le caractère 9, dans la chaîne cible.

On placera un modèle (encore appelé "expression régulière") dans une variable $regex, par exemple, en écrivant :

$regex="#[0-9]#";

le premier caractère #, identique au dernier caractère, est un séparateur qui peut être choisi arbitrairement.

La fonction preg_match, qui renvoie vrai ou faux selon le cas, sera utilisée pour traiter la chaîne cible, sous la forme :

if(pregex_match($regex,$cible,$resumatch)) { echo "test vérifié"; }

Les "modèles" peuvent être assez complèxes, car ils permettent de rechercher si des groupements existent ou n'existent pas, s'ils sont précédés ou suivis par d'autres groupements, s'ils sont uniques, ou répétés...

On utilise des symboles ou opérateurs comme ^, $, ., *, !, \,[, ], (, ),{, }, -, ?... Pour la sygnification et des exemples d'utilisation de ces symboles, consultez les sites consacrés au PHP.

Voici un petit récapitulatif, que j'ai copié à partir du site expreg.com :

. le point "n'importe quel caractère"

  [...] classe de caractères "tous les caractères énumérés dans la classe"

  [^...] classe complémentée "Tous les caractères sauf ceux énumérés"

  ^ circonflexe "positionne la recherche au début de la chaine, de la ligne..."

$ dollar "marque la fin d'une chaine, d'une ligne..."

| barre verticale "alternative - ou reconnaît l'un ou l'autre"

(...)parenthèse "utilisée pour limiter la portée d'un masque ou de l'alternative"

{m,n} accollade "quantificateur utilisé pour la répétition d'un motif"

  * astérisque "0, une ou plusieurs occurrences"

  + le plus "une ou plusieurs occurrences"

  interrogation "0 ou une occurrence"

Des options peuvent être ajoutées à la fin d'un modèle, pour préciser si la recherche doit ignorer les minuscules ou les majuscules, si elle doit se faire sur plusieures lignes... Par défaut, la recherche se fait sur la portion de chaîne cible, jusqu'à la rencontre du symbole \n (fin de ligne)

Les utilisations les plus courantes des modèles sont, par exemple :

rechercher les url qui peuvent figurer dans une page

rechercher toutes les adresses électroniques qui figurent dans un document

trouver tous les mots précédés ou suivis par une expression donnée...

On comprend que les outils de recherche et d'extraction, utilisés par les moteurs de recherche et par les transcodeurs, traducteurs, calculateurs formels... utilisent largement la notion de "modèle"

Certains opérateurs rencontrés dans les modèles, ne fonctionnent pas tout à fait comme dans le langage PERL, et réciproquement. Je vous donne ci-dessous quelques exemples d'utilisation d'opérateurs, qui fonctionnent dans les version de PHP supèrieures à la version 4.3

On peut utiliser les crochets, pour rechercher l'occurrence de certains caractères : Exemple #[a-z0-9]# signifie "je recherche si il y a un caractère a, ou b...ou z, ou un chiffre 0, ou 1...ou 9, dans la chaîne cible.

L'opérateur "exclamation" est utilisé, comme en C, pour la négation : Exemple : #[!012]# signifie "reconnaitre si il n'y a pas de 0, pas de1 et pas de 2 dans la cible.

Certains modèles prédéfinis ont une syntaxe simple, pour faciliter les recherches courantes.

Nous avons déjà rencontré le modèle #\d#, que l'on peut complèter avec les modèles suivants :

#\c" permet de savoir si la chaîne cible contient un caractère.

#\w# qui signifie "reconnaître les mots"

On convient que le caractère réservé qui suit le symbole "\", écrit en majuscule, représente la négation de sa signification, quand il est en minuscule. Exemple : #\D# signifie "reconnaître s'il n'y a pas de chiffres dans la cible.

De même #\C# permet de savoir si la chaîne cible ne contient pas de caractères, #\W# si elle ne contient pas de mot...

Les parenthèses permettent de capturer des expressions reconnues dans le texte. elles restent stockées en mémoire pour être ensuite (éventuellement) réutilisées. Exemple : #(coucou)(bonjour)(au revoir)# signifie "reconnaître "coucou", "bonjour", et "au revoir", dans la chaîne cible. Les variables "coucou", "bonjour"... seront copiées dans \\1, \\2...

La notation \\1, \\2... est souvent appelée "référence arrière", car elle permet de retrouver les variables indiquées, dans l'ordre d'apparition des parenthèses dans le modèle.

Les parenthèses peuvent être imbriquées. On peut demander à une parenthèse d'être "non capturante" : Exemple #(?:coucou)# signifie "reconnaître le mot "coucou" sans le conserver dans la variable \\1.

Dans les modèles, on peut définir des tests avant ou arrières, négatifs ou positifs. Ces tests permettent de demander que l'on trouve tel caractère à telle position. Les tests avancés regardent vers la droite, si l'on trouve tel expression à telle position. Voici un exemple :

Exemple #study(?=vox)#qui signifie "peut-on trouver l'expression "study" suivie immédiatement par l'expression "vox" dans la cible.

Voici un petit code en PHP, qui permet de savoir si il existe "vox" immédiatement situé à droite de "study" dans la chaîne $phr :

<?

$phr="Bienvenue dans le site studyvox, qui contient des aides pour Windows.";

$pattern="#study(?=vox)#";

if(preg_match($pattern, $phr, $matches))

print_r($matches);

else

echo "pas d'occurence de study suivi de vox dans la phrase";

?>

Voici maintenant le résultat de l'exécution de ce code PHP :

Array ( [0] => study )

Les test avants négatifs: (?!expression) Comme le test avant positif, le test avant négatif va regarder sur la droite dans le texte cible, mais en vérifiant si la sous-expression dont il fait partie ne peut réussir.

Les tests arrières positifs: (?<=expression) Le test arrière positif regarde en arrière dans le texte, c'est à dire qu'il va vérifier sur la gauche si la sous-expression dont il fait partie peut réussir.

Les tests arrières négatifs: (?

Les tests conditionnels: (?(if) then | else)

La structure conditionnelle permet d'exprimer un "si, alors, sinon" comme dans le langage C.

Les limites de mot: \b

Les limites de mots reconnaissent un emplacement dans une chaine. On apelle limite de mot, ou séparateur, tout caractère qui n'est pas adjacent à un autre caractère normal et non spécial comme par exemple, le point, la virgule, l'espace ou la tabulation, le saut de ligne, la nouvelle ligne...

Les modificateurs de codes: (?modificateur)

Voici les 4 modificateurs de code : i insensibilité aux majuscules ou aux minuscules

x permet de reconnaitre le format de commentaire

s le point reconnait tout

m recherche multilignes

Ces modificateurs peuvent être placés juste après une parenthèse ouvrante, (et alors ils ne s'appliquent qu'au contenu de la parenthèse) ou juste à la fin du modèle (et alors, ils correspondent à des options pour tout le modèle)

Maintenant que l'on sait ouvrir des fichiers et rechercher des suites de caractères dans des chaînes, il nous reste à savoir comment utiliser les opérateurs et les fonctions du PHP, pour développer des projets interactifs, des traitements de base de données... Il existe de nombreuses fonctions prédéfinies du PHP, pour l'extraction et le remplacement de chaînes ou portions de chaînes, dans des chaînes ou dans des tableaux. Vous les trouverez dans la page suivante.

suivant : les fonctions, les formulaires, la recherche et l'extraction dans les chaînes...

Retour dans le sommaire de la rubrique outils