Tutorial sur les expressions rationnelles (expressions régulières)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 121 fois - Téléchargée 28 fois

Contenu du snippet

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 / Exemple :


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

A voir également

Ajouter un commentaire

Commentaires

Messages postés
20
Date d'inscription
jeudi 18 septembre 2003
Statut
Membre
Dernière intervention
26 septembre 2008

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é...
Messages postés
47
Date d'inscription
vendredi 7 octobre 2005
Statut
Membre
Dernière intervention
2 janvier 2008

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 :)
Messages postés
267
Date d'inscription
lundi 22 septembre 2003
Statut
Membre
Dernière intervention
27 novembre 2005

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 [xxxx yyyy], l'expression etai :

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

d'ou pour toi :

\[b\]([^]].*)\/b\
Messages postés
20
Date d'inscription
jeudi 18 septembre 2003
Statut
Membre
Dernière intervention
26 septembre 2008

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 quelque chose par quelque chose. 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 et , dans mon cas, on marque comme fonction :
echo ereg_replace("\[b\]([^]])\/b\","\\1",$texte);
Et ca marche !! Mais le seul problème est que si on marque ] dans notre texte $texte entre et , 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 !!
Messages postés
6
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
26 novembre 2004

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
Afficher les 16 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.