begin process at 2012 05 27 20:45:09
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriaux

 > TUTORIAL SUR LES EXPRESSIONS RATIONNELLES (EXPRESSIONS RÉGULIÈRES)

TUTORIAL SUR LES EXPRESSIONS RATIONNELLES (EXPRESSIONS RÉGULIÈRES)


 Information sur la source

Note :
7 / 10 - par 12 personnes
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Tutoriaux Niveau :Débutant Date de création :04/12/2003 Date de mise à jour :04/12/2003 20:16:14 Vu :5 685

Auteur : perig

Ecrire un message privé
Site perso
Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

 Description

Voilà, je ne sais pas si une autre personne l'a fait avant moi mais comme j'avais du temps a perdre, j'ai fait une petite recherche sur le net et j'ai trouvé tout plein de choses sur les expressions rationnelles, il me semble que l'on dit aussi expressions régulières.

Donc voilà en condensé ce que ça donne :

Source

  • Une expression rationnelle permet d'effectuer des recherches complexes dans une chaîne de caractères.
  • Ex :
  • Soit $Chaine une chaîne quelconque.
  • On cherche a savoir a quoi correspond cette chaîne.
  • Pour cela on va utiliser le code suivant :
  • If (ereg("[^0-9]",$Chaine))
  • {
  • print $Chaine." est un nombre" ;
  • }
  • else
  • {
  • print $Chaine. "est tout sauf un nombre" ;
  • }
  • Interprétation :
  • La fonction ereg(arg1,arg2)
  • Cette fonction va examiner la chaîne, le premier argument contient le profil de recherche et le second la chaîne dans la quelle on veut faire la recherche.
  • Elle renvoi vrai ou faux
  • Ereg va alors rechercher dans la chaîne tout ce qui se trouve dans les [ ] de l'arg1 ici : "[^0-9]"
  • Ici on va rechercher tous les caractères compris entre 0 et 9 (donc tous les chiffres)
  • Et la fonction ereg() va renvoyer vrai si la chaîne comprend autre chose que ces caractères (c'est le ^ qui veux dire tout sauf )
  • Les différents "arg1" de recherche
  • Symbole pour vérifier si la chaîne
  • . comprend un caractère quelconque
  • .* comprend un nombre quelconque de caractère quelconque
  • ^a commence par un "a"
  • a$ finis par "a"
  • a+ et a* comprend au moins un "a"
  • a? comprend aucun "a" ou 1 seul
  • \n comprend un alinéa
  • \t comprend une tabulation
  • (ab) comprend la chaîne "ab"
  • a|b comprend "a" ou "b"
  • a{2} comprend la chaîne "aa"
  • a{1,} comprend les chaînes "a" ou "aa" ou "aaa" ou.
  • a{1,3} comprend les chaînes "a" ou "aa" ou "aaa"
  • [a-z] comprend n'importe quelle lettre minuscule
  • [A-Z] comprend n'importe quelle lettre en majuscule
  • [0-9] comprend n'importe quel chiffre de 0 a 9
  • ^[a-z] donnera vrai que s'il ne trouve rien d'autre que des lettres en minuscules
  • [[:alpha:]] comprend n'importe quelle lettre
  • [[:digit:]] comprend n'importe quel chiffre
  • [[:alnum:]] comprend n'importe quel chiffre ou lettre
  • [[:cntrl:]] comprend n'importe quel caractère de contrôle
  • [[:print:]] comprend n'importe quel caractère imprimable
  • [[:graph:]] comprend n'importe quel caractère imprimable sauf l'espace
  • [[:blank:]] comprend l'espace ou la tabulation
  • [[:space:]] comprend un espace
  • [[:upper:]] comprend n'importe quelle lettre majuscule
  • [[:lower:]] comprend n'importe quelle lettre minuscule
  • [[:punct:]] comprend n'importe quel signe de ponctuation
  • [[:xdigit:]] comprend n'importe quel chiffre hexadécimal
  • NB :
  • On peut additionner ces symboles pour donner des recherches plus complexe
  • ainsi :
  • "^[a-z0-9_]|\\-|\\.)+@([a-z0-9_]|\\-\\.)+\\.+([a-z0-9])$"
  • signifie que l'on ne sort vrai que si la chaîne :
  • 1) Commence par une sous chaîne (de lettres en minuscules ou de chiffres ou de . ou de - ou de _)
  • 2) Et suivit d'un @ lui-même suivit par une sous chaîne (de lettres en minuscules ou de chiffres ou de . ou de - ou de _)
  • 3) Et suivit d'un . lui-même suivit par une sous chaîne (de lettre en minuscule ou de chiffres )
  • en bref cette adition de symbole permet de contrôler que la chaîne est une adresse email
  • Fonctions utiles
  • eregi() idem ereg() mais ne fais pas la différence entre majuscules et minuscules.
  • ereg_replace(chaîne a rechercher, chaîne de remplacement, chaîne )
  • eregi_replace() Idem ereg_replace() mais ne fais pas la différence entre majuscules et minuscules.
  Une expression rationnelle permet d'effectuer des recherches complexes dans une chaîne de caractères.

Ex :
Soit $Chaine une chaîne quelconque.
On cherche a savoir a quoi correspond cette chaîne.
Pour cela on va utiliser le code suivant :
If (ereg("[^0-9]",$Chaine))
{
 print $Chaine." est un nombre" ;
}
else
{
print $Chaine. "est tout sauf un nombre" ;
}

Interprétation :

La fonction ereg(arg1,arg2)
 Cette fonction va examiner la chaîne, le premier argument contient le profil de recherche et le second la chaîne dans la quelle on veut faire la recherche.
Elle renvoi vrai ou faux

Ereg va alors rechercher dans la chaîne tout ce qui se trouve dans les [ ] de l'arg1 ici : "[^0-9]"

Ici on va rechercher tous les caractères compris entre 0 et 9 (donc tous les chiffres) 
Et la fonction ereg() va renvoyer vrai si la chaîne comprend autre chose que ces caractères (c'est le ^ qui veux dire tout sauf )

Les différents "arg1" de recherche
Symbole pour vérifier si la chaîne
.     comprend un caractère quelconque
.*   comprend un nombre quelconque de caractère quelconque 
^a  commence par  un "a"
a$  finis par "a"
a+ et a*  comprend au moins un "a"
a?  comprend aucun "a" ou 1 seul
\n  comprend un alinéa
\t  comprend une tabulation
(ab)  comprend la chaîne "ab"
a|b  comprend "a" ou "b"
a{2}  comprend la chaîne "aa"
a{1,}  comprend les chaînes "a" ou "aa" ou "aaa" ou.
a{1,3}  comprend les chaînes "a" ou "aa" ou "aaa" 
[a-z]  comprend n'importe quelle lettre minuscule
[A-Z]  comprend n'importe quelle lettre en majuscule 
[0-9]  comprend n'importe quel chiffre de 0 a 9
^[a-z]  donnera vrai que s'il ne trouve rien d'autre que des lettres en minuscules
[[:alpha:]]  comprend n'importe quelle lettre
[[:digit:]]  comprend n'importe quel chiffre
[[:alnum:]]  comprend n'importe quel chiffre ou lettre
[[:cntrl:]]  comprend n'importe quel caractère de contrôle
[[:print:]]  comprend n'importe quel caractère imprimable
[[:graph:]]	  comprend n'importe quel caractère imprimable sauf l'espace
[[:blank:]]  comprend l'espace ou la tabulation
[[:space:]]  comprend un espace
[[:upper:]]  comprend n'importe quelle lettre majuscule
[[:lower:]]  comprend n'importe quelle lettre minuscule
[[:punct:]]  comprend n'importe quel signe de ponctuation
[[:xdigit:]]  comprend n'importe quel chiffre hexadécimal

NB : 
 On peut additionner ces symboles pour donner des recherches plus complexe
ainsi : 
"^[a-z0-9_]|\\-|\\.)+@([a-z0-9_]|\\-\\.)+\\.+([a-z0-9])$"
signifie que l'on ne sort vrai que si la chaîne :
1) Commence par une sous chaîne (de lettres en minuscules ou de chiffres ou de . ou de - ou de _)
2) Et suivit d'un @ lui-même suivit par une sous chaîne (de  lettres en minuscules ou de chiffres ou de . ou de - ou de _)
3) Et suivit d'un . lui-même  suivit par une sous chaîne (de lettre en minuscule ou de chiffres )
en bref cette adition de symbole permet de contrôler que la chaîne est une adresse email


Fonctions utiles
eregi() idem ereg() mais ne fais pas la différence entre majuscules et minuscules.

ereg_replace(chaîne a rechercher, chaîne de remplacement, chaîne )

eregi_replace() Idem ereg_replace() mais ne fais pas la différence entre majuscules et minuscules.

 Conclusion

Je pense que ça servira à certain, si vous avez des choses a contester ou a rajouter n'hésitez pas .
Je cherche juste a savoir si expressions rationnelles = expressions régulières


 Sources de la même categorie

Source avec une capture INTÉGRER À UNE BASE DE DONNÉES DES COORDONNÉES GÉOGRAPHIQUES... par slhuilli
Source avec Zip DÉCOMPOSER UN CODE PHP AVEC LA FONCTION INCLUDE par Julien39
CRÉATION D'UN SCRIPT D'AUTHENTIFICATION par phpAnonyme
Source avec Zip Source avec une capture N/X API: GOOGLE MAPS DEPUIS PHP VALID W3C par GillesWebmaster
PHP EXTRAIRE DES MAILS D'UN GROS FICHIER LOCAL OU DISTANT par cosmoswarezone1

Commentaires et avis

Commentaire de lumesh le 05/12/2003 06:54:59

pas mal du tout !
sympa ton tuts, bien fait . thx.

Commentaire de revinc le 05/12/2003 13:17:04

Sauf qu'utiliser les expressions régulières est hyper lent surtout quand il y a déjà les fonctions pour comme is_numeric() pour vérifier si une chaîne de caractères est un nombre

Commentaire de Kirua le 05/12/2003 14:08:13

j'avais jamais entendu qu'on disait expression rationnelle... tu as vu ça où ?? pour moi y a que expression régulière, c'est ce qui s'utilise le plus souvent.

Commentaire de perig le 05/12/2003 17:39:55

revinc --> désolé, je ne connais pas tout!! Je début en php (enfin si on veut) de plus ta fonction permet de reconaitre un nombre ou une chaine mais si tu veux vérifier une adresse email je pense que les expréssions régulières c'est plus simple. non?

Kirua --> j'ai trouvé "expression rationnelle" sur un site et j'ai aussi emprunté un petit livre sur le php (vraiment le minimum) et ils disent "expressions rationnelles"

Commentaire de Kirua le 05/12/2003 17:48:39

ah, ben je ne savais pas que ça s'utilisait, c'est la première fois que je vois ça, merci pour la précision.

pour les adresses E-mails, c'est plus complexe qu'on ne le croit, allez donc jeter un oeil sur www.regxlib.com y a des expressions de plusieurs lignes de long qui permettent de réellement en reconnaître une (tous les formats imaginables, c'est basé sur les conventions de je ne sais pas quel organisme. ça permet même de reconnaître les adresses dont le domaine est une IP)

Commentaire de kimmelf2 le 06/12/2003 01:57:34

je dirais pas que l'adresse email est le truc le + difficile a filtrer mais ...

:-)

Commentaire de Kirua le 06/12/2003 11:44:01

j'ai pas dit ça non plus, mais reconnaître s'il y a xxxxx@xxxxx.xxx ça ne suffit pas.

Commentaire de kimmelf2 le 07/12/2003 01:10:51

disons que si on veux que ca respecte la norme de la RFC, c'est pas a la portee du debutant

Commentaire de TASIOT le 24/06/2004 19:16:46

Explication sur expression rationnelle ou expression reguliere :

Expression rationnelle est le seul terme exact !

En effet, expression reguliere est venu par l'anglais dont la traduction de Expression rationnelle est Regular Expression abregé en RegExp.
Mais en francais, Regular Expression ne veut pas dire expression reguliere, mais bien expression rationnelle !!

En esperant avoir réglé le prob des programmeurs PHP qui se prennent la tête tous les week ends ... :)

Commentaire de TASIOT le 24/06/2004 19:16:58

Explication sur expression rationnelle ou expression reguliere :

Expression rationnelle est le seul terme exact !

En effet, expression reguliere est venu par l'anglais dont la traduction de Expression rationnelle est Regular Expression abregé en RegExp.
Mais en francais, Regular Expression ne veut pas dire expression reguliere, mais bien expression rationnelle !!

En esperant avoir réglé le prob des programmeurs PHP qui se prennent la tête tous les week ends ... :)

Commentaire de perig le 24/06/2004 20:16:23

Merci pour cette info [;)].

C'est malheureusement souvent le prob. des traductions (Ils pourraient le signaler tout de même que c'est une traduction de l'Anglais).
[:(]

Commentaire de jimbz le 28/06/2004 23:09:54

Vraiment super pratique comme référence d'un débutant ds les expressions "(régulières)|(rationnelles)"! Je pense que tout le monde a pensé la meme chose la première qu'on en voit une, non?(c'est a dire: Mais keskecékeca???) Enfin encore une fois très bien fait: très très clair, complet et concis!

Sinon pour les trads anglaises jcroi kon est condamné a les utiliser: vs avez jamais dit librairie a la place de bibilothèque? Sinon on peut dir library et regexp, ca règle le pb lol

Allez, encore merci a biento

Commentaire de TASIOT le 28/06/2004 23:24:22

Bon voila, moi je m'y connais pas mal en PHP donc aussi un peu en RegExp ou plutot ExpRatio lol mais moi aussi je réussi à avoir des failles... :( et oui !

J'explique mon prob, j'ai une expression rationnelle qui remplace les [b]quelque chose[/b] par <b>quelque chose</b>. A noter que pour récupérer le contenu des parenthèses capturantes, il suffit de mettre \\ suivi du numéro de la ligne, comme avec le tableau créé par ereg.
Ainsi, si on veux remarqué le contenu que l'on trouve entre [b] et [/b], dans mon cas, on marque comme fonction :
echo ereg_replace("\[b\]([^]])\[/b\]","<b>\\1</b>",$texte);
Et ca marche !! Mais le seul problème est que si on marque ] dans notre texte $texte entre [b] et [/b], eh bien ca beug légèrement.

Ainsi, je demande à tous ceux qui ont une réponse, de me contacter soit par ces commentaires, soit par mon email : os.com@free.fr

MERCI D'AVANCE !!

Commentaire de kimmelf2 le 29/06/2004 22:50:21

je pense que ([^]]) s'interprete en " n'importe quelle chaine qui ne contient pas un ] " ???

mais il ne te manquerais pas un * ???

j'ai trouve (en javascript) cet exemple :
pour transformer un [link xxxxxx]yyyyy[/link] en <a href="xxxx">yyyy</a>, l'expression etai :

\[link (.*)\](.*)\[\/link\]

d'ou pour toi :

\[b\]([^]].*)\[/b\]

Commentaire de Gwinyam le 15/08/2006 15:22:48

Salut,
Tout d'abord bravo pour ce tuto, il est plutôt complet et très bien pour les newbies...

Dites les gars, en ce qui me concerne, je suis sur un projet de CMS, mais j'ai un léger problème, à quelque chose près similaire à celui de Tasiot.

Je m'explique:
L'idée est de permettre un utilisateur d'appeller des fonctions php dans le contenu des articles. Ces fonctions sont tirées d'une librairie (ou bibliothèque) créée pour la gestion du contenu. Le problème c'est que j'ai des paramètre à passer.

Exemple:
un contenu tel que je souhaite qu'il soit tapé par l'utilisateur "abcde::disp_profil(52)::fghi"
Donc l'idée est de faire appel à une fonction php qui remplacera "::disp_profil(52)::" par ce que retournera la fonction php disp-profil, avec l'argument 52, argument qui peut varier de taille selon le besoin. Et c'est là que je suis paumé...

Vous auriez pas un petit coup de main en stock à me filer?
svp :)

Commentaire de TASIOT le 16/08/2006 12:11:40

Bonjour Gwinyam,

Tout d'abord, je tiens à dire que j'ai largement progressé en matière d'expression rationnelle et que ton problème n'en est plus un.
Tu devrais peut-être te renseigner sur la fonction preg_replace_callback() qui permet entre autre de remplacer une chaine par le resultat d'une fonction à qui on passe en argument la chaine trouvée (plus d'info sur php.net).

<?php

$chaine = 'La carré de 4 est ::carre(4)::'; // La chaine dans laquelle tu vas rechercher un element
$profil = '`::([a-z_\-]+)(\((.*?)\))?::`is'; // Non sensible à la casse et non gourmand

$result = preg_replace_callback($profil, 'parse', $chaine);

function parse($match)
{
$return = '';
eval ('$return = '.$match[1].'('.$match[3].');');

return $return;
}

function carre($nb=0)
{
return $nb * $nb;
}
echo $result;

?>

Voila. Cette fonction va renvoyer "Le carré de 4 est 16".
Tu peux également utiliser la fonction sans ses parenthèse dans ton texte. Genre "Le carré de 0 est ::carre::".

En espérant t'avoir aidé...

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,796 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales