PCRE

Expressions régulières-PCRE

PCRE: Perl Compatible Regular Expression (plus performants que POSIX.)

Saisies
$pcre = "/.../i";  
$pcre = '#...#';  
$pcre = '`...`';  


Fonctions
if(preg_match($pcre, $txt)) Cherche arrêt au premier, boolean
if(preg_match($pcre, $txt,$tab))
les variables $1,$2...vont dans $tab
echo preg_match_all($pcre, $txt,$tabResultats) Cherche tout, retourne total
$resultat=preg_replace($pcre,$remplacement,$txt) Remplace, array
$resultat=preg_replace($pcre,$remplacement,$txt,10)
Idem, limite à 10 modifs 

Liens utiles:
http://www.phpfrance.com/tutoriaux/index.php/2005/04/10/28-les-expressio...
http://riki-lb1.vet.ohio-state.edu/mqlin/computec/tutorials/PHP_PCRE_Che...

preg_match
$pcre= "/dean/";
preg_match($pcre, $txt);
Cherche dean
$pcre= "/dean/i";
preg_match($pcre, $txt);
Insensible à la casse
$pcre= "!(\\d{2})[-/](\\d{2})[-/](\\d{2}(?:\\d{2})?)!";
preg_match($pcre,$date,$tab);
recherche une date MM/DD/YYYY (boolean+array)
MM/DD/YY
MM-DD-YYYY
MM-DD-YY
stock chaque partie dans un tableau d'indice 1 à 3

$pcre= "/^[\w\.]+@[\w\.]+\.[a-z]+$/i";
preg_match($regex, $pcre));

Mail
$dateToday = gmdate(“Y m d”);
$pcre= "/(\d{4})\s(\d{2}) (\d{2})/";
preg_match($pcre, $dateToday, $tab);
Dune date
$pcre= "/([\w\.]+)@([\w\.]+\.[a-z]+)/i";
preg_match($pcre, $mail, $tab));
idem stock les 2 parties (login + domaine)
$pcre= "/http:\/\/.*\.(com|net|org|info|biz)\/.*/";
preg_match($pcre, $txt);
Url
$pcre= '#<([ib])>(.*?)</\1>#';
preg_match($pcre, $txt, $tabOut);
entre balises <i> et <b>
$pcre="/0-9a-zA-Z/"
Hexadecimale
$pcre="/(\n|\r|\n\r)/";
Fin de ligne

preg_match_all
$pcre="/[\w\.]+@[\w\.]+\.[a-z]+/i";
preg_match_all($pcre, $txt, $tab);
Mails
$pcre= "/http:\/\/.*\.com|net|org|info|biz\/.*/";
echo preg_match_all($pcre, $txt,$tab);
Url
$pcre= '# (simples?)[ ,!.;:]#';
$pcre= '#\bmot?\b#';//méthode rapide
preg_match_all
($pcre, $txt, $out)
Optimisation avec encadrement de mot \b
preg_grep
$resTab = preg_grep(“/dean/”, $tab) $resTab contient les champs contenant dean (array)
preg_grep("/^\d+$/", $tab) $tab contiendra que des non-numériques
preg_replace
preg_replace(?/<([^>]*)>/e?, ?strrev(‘\\1’)?, $str) Remplace les chaines entre <> par leurs inverses
$pcre= "{<br>}i";
preg_replace($pcre, "<br />", $txt);
Normalisation de br
$pcre=
"{ \\b # start at word\n"
. " # boundary\n"
. "( # capture to $1\n"
. "(https?|telnet|gopher|file|wais|ftp) : \n"
. " # resource and colon\n"
. "[\\w/\\#~:.?+=&%@!\\-]+? # one or more valid\n"
. " # characters\n"
. " # but take as little as\n"
. " # possible\n"
. ")\n"
. "(?= # lookahead\n"
. "[.:?\\-]* # for possible punct\n"
. "(?:[^\\w/\\#~:.?+=&%@!\\-] # invalid character\n"
. "|$) # or end of string\n"
. ") }x";
echo preg_replace($pcre, "<a href=\"$1\">$1</a>", $text);
Créé des liens
$pcre= "/\/([^\/]*.jpg)/i";
$url = preg_replace($pcre, "/s800/$1", $txt);
Recherche le dernier répertoire du lien
$pcre="/^$/";
Ligne vide
preg_replace('`^A([[:alpha:]]+(?:-[[:alpha:]]+)*).*`','$1 : wanadoo',$host)
Recupe la ville dans un host wanadoo
Métacaractères echappés par \
^ Ligne commence par $ Ligne fini par
. tout sauf retour ligne    
    | alternative
? 0 ou 1 fois * 0 ou +
+ 1 ou + {nb1,nb2}
quantifieur, de nb1 à nb2
(le|la) parenthèse capturant le ou la
x x
(?:le|la) non capturant x x
Classes
[^a]
Pas de a
[-0-9]
Tiret interprété seulement en début de classe
[.]
Le point prends sa vrai signification dans une classe
   
[aeiou]
Voyelle
[0-9] Numérique
\d
Idem
\D
Pas numérique
[az-AZ] alphabétique
[az-AZ-09] alphanumérique
\w Idem + accents + _
\W pas alphanumérique
\s espace
\S pas d'espace
Options
i casse insensible
s le point prend tout y compris le retour à la ligne
m retour ligne pris en compte (multiligne)
   
Exemples  
$regex = '#dean?#i';
casse
$regex = '#in(?i)contour(?-i)nable#';
contour insensible, nable sensible
Assertions (+rapide)
(?<=motif) trouve une concordance à gauche
(?<!motif) ne trouve pas..
(?=motif) à droite
(?!motif)
ne trouve pas
$regex = '#\dean\b(?=\scaractères)#'
 
$pcre= '#(?=\s).*#';
preg_replace($pcre,"$1",$chaine)
Tout ce qu'il y a avant un espace
Liens utiles
http://www.spaweditor.com/scripts/regex/index.php