Nous allons aborder les différentes règles de bases qui permettent de construire des expressions régulières.

Remarque : cette page est assez longue et contient beaucoup d'informations que je n'ai pas pu regrouper en plus petites parties.

### Les caractères ordinaires

Les caractères ordinaires sont tous les caractères imprimables et non imprimables qui ne sont pas explicitement désignés comme des métacaractères :

- les caractères alphabétiques majuscules et minuscules,
- les chiffres,
- les signes de ponctuation,
- certains symboles.

La prise en compte des caractères accentués dépend de l'implémentation réalisée par le système. Généralement sous Windows les caractères accentués ne sont pas considérés comme des caractères alphabétiques.

La forme la plus simple d'une expression régulière est un seul caractère ordinaire qui correspond à lui-même dans une chaîne examinée.
Par exemple, un modèle comportant un seul caractère, comme e, correspond à la lettre e, où qu'elle apparaisse dans la chaîne, et quelque soit le nombre de fois où elle apparait.

N'hésitez pas à modifier les expressions régulières des exemples pour voir le résultat de leur interprétation.

Exemple : expression régulière simple
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Expression régulière simple'); $txt = "Il y a bien longtemps, dans une très lointaine galaxie (36éme lune à gauche après le Djedaille's Bar)..."; htmlInfo('Recherche tous les "e"'); testerExp('/e/', $txt); htmlInfo('Recherche tous les "6"'); testerExp('/6/', $txt); htmlInfo('Recherche tous les guillemets simples'); testerExp("/'/", $txt); htmlInfo('Recherche tous les points'); testerExp('/\./', $txt); htmlFin(); ?>

L'exemple précédent présente deux particularités :

- dans la recherche du caractère guillemet simple (') l'expression régulière est entourée avec des guillemets doubles pour éviter toute collision (ligne 13)
- pour rechercher le caractère . (point), il faut le protéger par un backslash (\) car ce caractère à une signification particulière dans le vocabulaire des expressions régulières (ligne 15).

### Les caractères à protéger

Les caractères qui font partie de la syntaxe des expressions régulières doivent être protégés par un backslash. Le tableau ci-dessous en fait la liste (nous verrons la signification détaillée de ces caractères dans les paragraphes suivants).

. | point | [ | crochet ouvrant
\ | backslash | | | barre verticale (pipe)
^ | chapeau | ( | parenthèse ouvrante
$ | dollar | ) | parenthèse fermante
? | point d'interrogation | * | étoile
+ | plus | { | accolade ouvrante

### L'opérateur ou : |

L'opérateur ou permet de rechercher un caractère ou un autre. Il est défini par le signe |.
Par exemple pour rechercher les e ou les n, on aura l'expression /e|n/

Exemple : l'opérateur ou
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Opérateur ou'); $txt = "Il y a bien longtemps, dans une très lointaine galaxie (36éme lune à gauche après le Djedaille's Bar)..."; htmlInfo('Recherche les "e" ou les "n"'); testerExp('/e|n/', $txt); // Le nombre d'opérateurs | n'est pas limité htmlInfo('Recherche les "g", les "t", les "a", les "3"'); testerExp('/g|t|a|3/', $txt); // Avec la protection obligatoire de certains // caractères, l'expression régulière devient // plus difficile à lire qu'à écrire htmlInfo('Recherche les points, les guillemets et les parenthèses'); testerExp("/\.|'|\(|\)/", $txt); htmlFin(); ?>

### Enumérations de caractères

L'opérateur ou est bien utile quand les choix sont peu nombreux (2 ou 3 possibilités différentes), mais quand le choix est étendu, il est plus simple d'utiliser une énumération.

Une énumeration de caractères est faite en utilisant les crochets [ et ] qui entourent les caractères énumérés. On défini ainsi une classe de caractères.

Par exemple pour rechercher toutes les voyelles, on aura l'expression régulière /[aeiou]/

Exemple : énumérations de caractères
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Enumérations de caractères'); $txt = "Il y a bien longtemps, dans une très lointaine galaxie (36éme lune à gauche après le Djedaille's Bar)..."; htmlInfo('Toutes les voyelles en minuscule'); testerExp('/[aeiou]/', $txt); htmlInfo('Toutes les voyelles ou les chiffres'); testerExp('/[aeiouAEIOU]|[0123456789]/', $txt); htmlFin(); ?>

### L'opérateur de négation : ^

Les crochets permettent de définir des classes de caractères recherchés, mais également des classes de caractères exclus. Il suffit de faire précéder la liste des caractères par le signe ^.

Si on prend l'expression qui permet d'obtenir toutes les voyelles :

Exemple : l'opérateur de négation
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Opérateur de négation'); $txt = "Il y a bien longtemps, dans une très lointaine galaxie (36éme lune à gauche après le Djedaille's Bar)..."; htmlInfo('Tout ce qui n\'est pas une voyelle minuscule'); testerExp('/[^aeiou]/', $txt); htmlInfo('Tous ce qui n\'est pas signe de ponctuation ou espace'); testerExp("/[^\.,';!? \/\(\)]/", $txt); htmlFin(); ?>

### Listes de caractères

Pour rechercher toutes les lettres de l'alphabet, nous pouvons utiliser l'expression régulière :
/[abcdefghijklmnopqrstuvwxyz]/
Plusieurs inconvénients : c'est long à écrire, sujet à erreur car on peut facilement oublier une lettre ou la doubler, pas facile à lire, carrément pénible si on veut ajouter les caractères en minuscules, etc.

La notation suivante permet de définir des listes : deux caractères séparés par le signe moins (-), le tout entouré par les crochets [ et ].

Par exemple :
/[a-z]/ recherche la présence d'au moins un caractère alphabétique en minuscule.
/[A-Z]/ recherche la présence d'au moins un caractère alphabétique en majuscule.
/[a-zA-Z]/ recherche la présence d'au moins un caractère alphabétique en minuscule ou en majuscule.
/[0-9]/ recherche la présence d'au moins un caractère numérique.

Bien sûr l'opérateur de négation ^ est utilisable.

Exemple : listes de caractères
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Listes de caractères'); $txt = "Il y a bien longtemps, dans une très lointaine galaxie (36éme lune à gauche après le Djedaille's Bar)...";; htmlInfo('Les lettres de l\'alphabet en minuscule'); testerExp('/[a-z]/', $txt); htmlInfo('a, b, c, d, e, ou f en minsucule ou majuscule'); testerExp('/[a-fA-F]/', $txt); htmlInfo('Un chiffre de 0 à 9'); testerExp('/[0-9]/', $txt); htmlInfo('Tout ce qui n'est pas lettres de l\'alphabet en minuscule ou majuscule ou un chiffre'); testerExp('/[^a-zA-Z0-9]/', $txt); htmlFin(); ?>

### Classes prédéfinies de caractères

Pour faciliter encore plus notre travail, il existe des classes prédéfinies de caractères, qui nous évitent de créer des ensembles connus et souvent utilisés. Certaines classes sont issues du standard POSIX, et sont reprises à l'identique dans les expressions régulières PCRE qui ajoutent aussi d'autres classes.

La prise en compte des caractères accentués dans les classes dépend de l'implémentation réalisée par le système. Généralement sous Windows les caractères accentués ne sont pas considérés comme des caractères alphabétiques.

[[:alnum:]] | Tous les caractères alphanumériques, minuscules et majuscules
[[:alpha:]] | Tous les caractères alphabétiques, minuscules et majuscules
[[:ascii:]] | Tous les caractères ascii de 0 à 127
[[:blank:]] | Tous les caractères "blancs" : espaces ou tabulations
[[:cntrl:]] | Tous les caractères de contrôle
[[:digit]] | Tous les chiffres
[[:lower:]] | Tous les caractères en minuscules
[[:print:]] | Tous les caractères imprimables (les caractères de contrôle exclus)
[[:punct:]] | Tous les caractères de ponctuation
[[:space:]] | Tous les caractères d'espacement (espaces, tabulations, saut de ligne, retour chariot)
[[:upper:]] | Tous les caractères en majuscules
[[:word:]] | Une lettre (majuscule ou minuscule), un chiffre (0 à 9) ou le caractère _ (underscore)
[[:xdigit:]] | Tous les caractères en hexadecimal
\d | Tous les chiffres
\D | Tous les caractères non numériques (inverse de \d)
\s | Tous les caractères d'espacement (espaces, tabulations, saut de ligne, retour chariot)
\S | Tout les caractères autre que d'espacement (inverse \s)
\w | Une lettre (majuscule ou minuscule), un chiffre (0 à 9) ou le caractère _ (underscore)
\W | Pas une lettre, ni un chiffre, ni _ (inverse de \w)

Exemple : classes de caractères
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Classes de caractères'); $txt = "Il y a bien longtemps, dans une très lointaine galaxie (36éme lune à gauche après le Djedaille's Bar)..."; htmlInfo('La classe alpha'); testerExp('/[[:alpha:]]/', $txt); htmlInfo('La classe \w'); testerExp('/\w/', $txt); htmlInfo('La classe alpha et la classe punct'); testerExp('/[[:alpha:][:punct:]]/', $txt); htmlInfo('La classe upper'); testerExp('/[\d[:upper:]]/', $txt); htmlFin(); ?>

### Chaînes de caractères

Dans les exemples précédents nous avons utilisé la forme la plus simple d'une expression : la recherche d'un seul caractère dans une chaîne. Pour rechercher une chaîne précise dans une autre, il suffit d'écrire cette chaîne telle quelle. Par exemple l'expression régulière /une/ permettra de rechercher la chaîne de caractères une.

Exemple : chaînes de caractères
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Chaînes de caractères'); $txt = "Il y a bien longtemps, dans une très lointaine galaxie (36éme lune à gauche après le Djedaille's Bar)..."; htmlInfo('Recherche la chaîne "une"'); testerExp('/une/', $txt); htmlinfo('Recherche "le" ou "la"'); testerExp('/le|la/', $txt); htmlFin(); ?>

### Le métacaractère point

Le métacaractère point (.) sert de joker pour remplacer n'importe quel caractère : alphabétique, numérique, espace, ponctuation, etc.

Exemple : le métacaractère point
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Métacaractère point'); $txt = "Il y a bien longtemps, dans une très lointaine galaxie (36éme lune à gauche après le Djedaille's Bar)..."; htmlInfo('Recherche "une" suivi de n\'importe quel caractère'); testerExp('/une./', $txt); htmlInfo('"a" suivi de n\'importe quoi, suivi de "a"'); testerExp('/a.a/', $txt); htmlInfo('"i" suivi de 2 caractères, suivis de "e"'); testerExp('/i..e/', $txt); htmlInfo('Un chiffre suivi de n\'importe quoi, suivi d\'une lettre'); testerExp('/\d.[a-z]/', $txt); htmlFin(); ?>

### Le métacaractère \

Le caractères backslash (\) a plusieurs rôles.

Il peut servir de caractère d'échappement pour les caractères non alphanumériques qui ont une signification spéciale (*, [, (), {, \, +, ?, |, ^, $).

Un second usage du backslash (\) permet d'atteindre des caractères non imprimables :
\a : émission d'un son (hexa 07)
\cx : control-x, où x est n'importe quel caractère
\e : echappement (escape) (hexa 1B)
\f : saut de page (formfeed) (hexa 0C)
\n : saut de ligne (newline) (hexa 0A)
\r : entrée (carriage return) (hexa 0D)
\t : tabulation (hexa 09)
\ddd : octal ou ddd est le code
\xhh : hexadécimal ou hh est la code

Le troisème usage du backslash (\) permet de spécifier des types de caractères génériques :
\d : un chiffre (0 à 9)
\D : n'importe quel caractère qui n'est pas un chiffre
\s : n'importe quel type d'espacement : tabulation, saut de ligne, saut de page, entrée et espace
\S : n'importe quel caractère qui n'est pas un espacement
\w : n'importe quel caractère de "mot" : une lettre (majuscule ou minuscule, caractères accentués compris), un chiffre (0 à 9) ou le caractère _ (underscore)
\W : n'importe quel caractère qui n'est pas un caractère de "mot"

Le quatrième usage du backslash (\) sert pour les assertions simples :
\b : correspond à un début ou une fin de "mot"
\B : inverse de \b
\A : correspond au début de la chaîne examinée. C'est l'équivalent du métacaractère ^, sauf si l'option m est utilisée, auquel cas ^est le début de chaque ligne trouvée dans la chaîne, et \A le début original de la chaîne.
\Z : correspond à la fin de la chaîne examinée. C'est l'équivalent du métacaractère $, avec le même comportement que \A.