Accès membres : identifiez-vous !     Dernière remise à jour du site : le Mar. 11 Novembre 2014 à 14:51:19

wxFrantz's Concept

Expressions régulières en PHP (suite)

10.  Exemples

Afin de concrétiser toute la théorie sur les expressions régulières, voici quelques exemples :

10.1. Supprimer tous les caractères qui ne sont pas des chiffres

$resultat=preg_replace('/[^0123456789]/','',$chaine);

Application : $chaine='azerty123'  =>  $resultat='123'

Les fonctions suivantes donnent le même résultat :

$resultat=preg_replace('/[^0-9]/','',$chaine);
$resultat=preg_replace('/[\D]/','',$chaine);
$resultat=preg_replace('/\D/','',$chaine);
$resultat=preg_replace('/[^\d]/','',$chaine);

10.2. Supprimer tous les espaces

$resultat=preg_replace('/ /','',$chaine);

Application : $chaine='Le chat court dans la nuit obscure et froide'
=>  $resultat='Lechatcourtdanslanuitobscureetfroide'

Les fonctions suivantes donnent le même résultat :

$resultat=preg_replace('/[\s]/','',$chaine);
$resultat=preg_replace('/\s/','',$chaine);
$resultat=preg_replace('/[^\S]/','',$chaine);

10.3. Supprimer tous les caractères non spécifiés

$resultat=preg_replace('/[^abcdefghijklmnopqrstuvwxyz0123456789 ]/i','',$chaine);

Application : $chaine='Le chat court dans la nuit obscure et froide132,;:!§/.?'
=>  $resultat='Le chat court dans la nuit obscure et froide132'

Les fonctions suivantes donnent le même résultat :

$resultat=preg_replace('/[^a-z0-9 ]/i','',$chaine);
$resultat=preg_replace('/[^a-z\d ]/i','',$chaine);

10.4. Purifier un code Morse

Ce code permet de filtrer un code Morse en ne gardant que les points, les tirets, les "slashes" et les espaces. Comme il s'agit majoritairement de caractères spéciaux, il est nécessaire de les échapper par un "anti-slash".

$resultat=preg_replace('/[^\.\-\/–• ]/','',$chaine);

Application : $chaine='––/•/•••/•••/•–/––•/•//•–//––––/•up•/••–•/••–•/•–•/•/•–•//•/–•//––/––12–/•–•/•&éçà••/•'
=>  $resultat='––/•/•••/•••/•–/––•/•//•–//––––/••/••–•/••–•/•–•/•/•–•//•/–•//––/–––/•–•/•••/•'

10.5. Tester une adresse mail

Avant de se lancer tête baissée, interrogeons nous sur la constitution d'une adresse mail. Au minimum, elle est constituée d'un nom composé de lettres et/ou chiffres, suivit d'une arobase, suivit d'un nom de domaine en lettres minuscules et/ou chiffres, suivit d'un point et d'une extension en 2 à 4 lettres.
Le nom peut comporter un tiret (-), un underscore (_) ou un point ; tandis que le nom de domaine peut comporter un tiret (-) ou un point.

Construction de la REGEX :

  • - La REGEX ne devra comporter que les caractères autorisés, elles devra donc commencer par ^ et finir par $ ;
  • - Le nom est constitué de lettres minuscules et/ou chiffres et/ou tirets et/ou underscores. Cette partie de REGEX comprendra donc [_a-z0-9-]+ ;
  • - Le nom pouvant être éventuellement séparé par un point, il faudra tester la présence des caractères à droite de ce point. Cette REGEX sera complétée par (\.[_a-z0-9-]+)* ;
  • - Suit à présent l'arobase et le nom de domaine. Ce qui correspond à @[a-z0-9-]+ ;
  • - Le nom de domaine pouvant être éventuellement séparé par un point, il faudra tester la présence des caractères à droite de ce point. Cette REGEX sera complétée par (\.[a-z0-9-]+)* ;
  • - Suit enfin l'extension de 2 à 4 lettres : (\.[a-z]{2,4})

Nous obtenons alors la REGEX /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/

Et voici le code utilisant la REGEX précédante pour tester une adresse mail :

<?php
if(preg_match('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/',$mail))
{
   echo 'Adresse mail valide';
}
else
{
   echo 'Adresse mail invalide';
}
?>

Application :

  • pseudo123@domaine.com est une adresse mail valide
  • nomarobasedomaine.com est une adresse mail invalide
  • prenom.nom@domaine.com est une adresse mail valide
  • prenom-compose_nom@nom-de-domaine.com est une adresse mail valide
  • Prenom_Compose.NOM@domaine.com est une adresse mail invalide
  • prénom.nom@domaine.com est une adresse mail invalide

10.6. Adresse mail cliquable

Précédemment, nous avons vu comment tester une adresse mail, à présent voyons comment la rendre cliquable.

Il suffit de remplacer la fonction preg_match précédente par la fonction preg_replace avec la même REGEX, et d'inclure les balises HTML ad hoc (<a href="mailto:nom@domaine.com"></a>). Nous obtenons ainsi le code suivant (sur une seule ligne) :

<?php
$mail_cliquable=preg_replace('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*
    (\.[a-z]{2,3})$/','<a href="mailto:$0">$0</a>',$chaine) // Sur une seule ligne
?>

Application :

Rappel : le $0 prend tout le texte reconnu par la REGEX, soit toute l'adresse mail dans notre cas.

10.7. Tester une URL

Il existe plusieurs types d'URL :

URL sans paramètre

Dans un premier temps, intéressons-nous à l'URL sans paramètre. Celle-ci commence par http:// puis contient des lettres minuscules ou majuscules, avec éventuellement des tirets (-), underscores (_) ou des points. Nous obtenons alors la REGEX suivante : #^http://[a-z0-9./_-]+#i

Essai avec le code suivant :

<?php
if(preg_match('#^http://[a-z0-9./_-]+#i',$url))
{
   echo 'URL valide';
}
else
{
   echo 'URL invalide';
}
?>

Application :

  • http://www.monsite.com/ est une URL valide
  • http://monsite.com/ est une URL valide
  • http://www.monsite.com/test.html est une URL valide
  • http://www.mon-site.com/test.html est une URL valide
  • http://www.mon_site123.com/test.html est une URL valide
  • htp://www.monsite.com/dossier/ressource est une URL invalide
URL avec des variables en paramètres

Maintenant que la REGEX précédante fonctionne pour les URL sans paramètre, faisons-la évoluer pour traiter les variables en paramètres.

Rappel : l'URL peut être du type http://www.monsite.com/index.php?page=5&variable1=toto&variable2=tutu

Nous conservons la REGEX précédante (#^http:\/\/[a-z0-9./_-]+#i), et nous la complétons pour traiter les variables éventuelles. Elles se présentent sous la forme d'une suite de lettres et/ou chiffres précédée d'un point d'interrogation pour la première et d'un & pour les suivantes. Nous obtenons alors la suite suivante :
((\?[_a-z0-9-]+)(=[_a-z0-9-]+))*((\&[_a-z0-9-]+)(=[_a-z0-9-]+))*

Ce qui nous donne en fin de compte :
#^http:\/\/[a-z0-9./_-]+((\?[_a-z0-9-]+)(=[_a-z0-9-]+))*((\&[_a-z0-9-]+)(=[_a-z0-9-]+))*#i

Et voici le code utilisant la REGEX précédante pour tester une URL (condition sur une seule ligne) :

<?php
if(preg_match('#^http:\/\/[a-z0-9./_-]+((\?[_a-z0-9-]+)(=[_a-z0-9-]+))*((\&[_a-z0-9-]+)
	(=[_a-z0-9-]+))*#i',$url))
{
   echo 'URL valide';
}
else
{
   echo 'URL invalide';
}
?>

Application :

  • http://www.monsite.com/ est une URL valide
  • http://monsite.com/ est une URL valide
  • http://www.monsite.com/test.html est une URL valide
  • http://www.mon-site.com/test.html est une URL valide
  • http://www.mon_site123.com/test.html est une URL valide
  • http://www.monsite.com/images/mon_image2.jpg est une URL valide
  • http://www.monsite.com/dossier/ressource est une URL valide
  • http://www.monsite.com/index.php?page=5 est une URL valide
  • http://www.monsite.com/index.php?page=5&variable1=toto est une URL valide
  • http://www.monsite.com/index.php?page=5&variable1=toto&variable2=tutu est une URL valide
  • http://www.monsite.com/dossier/index.php?page=5&variable1=toto&variable2=tutu est une URL valide

10.8. URL cliquable

Précédemment, nous avons vu comment tester une URL, à présent voyons comment la rendre cliquable.

Il suffit de remplacer la fonction preg_match précédente par la fonction preg_replace avec la même REGEX, et d'inclure les balises HTML ad hoc (<a href="URL"></a>). Nous obtenons ainsi le code suivant (sur une seule ligne) :

<?php
$url_cliquable=preg_replace('#^http:\/\/[a-z0-9./_-]+((\?[_a-z0-9-]+)(=[_a-z0-9-]+))*
	((\&[_a-z0-9-]+)(=[_a-z0-9-]+))*#i','<a href="$0">$0</a>',$chaine)
?>

Application :

Rappel : le $0 prend tout le texte reconnu par la REGEX, soit toute l'URL dans notre cas.

10.9. Insérer un espace tous les x caractères dans une chaine

Le code ci-dessous sert à séparer une chaine en groupe de 5 caractères, tout en omettant les espaces :

Et voici le code utilisant la REGEX précédante pour tester une URL :

<?php
function coupe_mot($chaine,$coupure='5',$inserer=' ')
{
   // Sécurité : supprime tout ce qui n'est pas des chiffres
   $coupure=preg_replace('/[^0-9]','',$coupure);
   // Sécurité à l'affichage, pour ne pas prendre en compte un nombre trop grand, on le force à 5
   if($coupure>500) $coupure=5;
   // REGEX : insère un espace tous les x caractères (ne contenant pas d'espace) de la $chaine
   return preg_replace('/([\S]{'.$coupure.'})/', '$1'.$inserer, $chaine);
}
$texte_espace=coupe_mot($texte);
?>

Application :

  • - Le chat noir court dans la nuit obscure et froide devient Le chat noir court dans la nuit obscu re et froid e
  • - 101100001101101101101101010110100010011 devient 10110 00011 01101 10110 11010 10110 10001 0011
  • - A0123467ACD123456789ADEF123456789ABCDEF devient A0123 467AC D1234 56789 ADEF1 23456 789AB CDEF

10.10. BBCode

Le BBCode permet d'éviter les injections HTML et SQL, et est utilisé pour mettre en forme les messages des forums de discussion. Le visiteur écrit son texte entre certaines balises encadrées par des crochets, et le script PHP transforme tout ça en code HTML.

Dans le paragraphe 9. Capture et remplacement, l'application concernait un BBCode de mise de texte en gras avec le code suivant :

<?php
$texte = preg_replace('#\[b\](.+)\[/b\]#i', '<strong>$1</strong>', $texte);	// Texte en gras
?>

En variantant ce code, nous pouvons gérer les autres principaux BBCode :

<?php
// [b]texte en gras[/b]
$texte = preg_replace('#\[b\](.+)\[/b\]#isU', '<strong>$1</strong>', $texte);
// [i]texte en italique[/i]
$texte = preg_replace('#\[i\](.+)\[/i\]#isU', '<em>$1</em>', $texte);
// [u]texte souligné[/u]
$texte = preg_replace('#\[u\](.+)\[/u\]#isU', '<u>$1</u>', $texte);
//[s]texte barré[/s] ou [strike]texte barré[/strike]
$texte = preg_replace('#(\[s\](.+)\[/s\]|\[strike\](.+)\[/strike\])#i', '<strike>$1</strike>', $texte);
// [color=red]couleur (valeur html) du texte[/color] ou bien [color=#01235f]couleur (valeur hexadécimale) du texte[/color]
$texte = preg_replace('#\[color=(red|green|blue|#[0-9a-f]{6})\](.+)\[/color\]#isU', '<span style="color : $1;">$2</span>', $texte);
// [font=Arial]Texte en police spécifique[/font]
$texte = preg_replace('#\[font=(.+)\](.+)\[/font\]#isU', '<span style="font-family : $1;">$2</span>', $texte);
// Texte de taille différente : [size=50]Texte (taille en pourcentage)[/size]
$texte = preg_replace('#\[size=([0-9]+)\](.+)\[/size\]#isU', '<span style="font-size: $1%;">$2</span>', $texte);
// Texte aligné à gauche : [left]Texte[/left]
$texte = preg_replace('#\[left\](.+)\[/left\]#isU', '<p style="text-align : center;">$1</p>', $texte);
// Texte centré : [center]Texte[/center]
$texte = preg_replace('#\[center\](.+)\[/center\]#isU', '<p style="text-align : center;">$1</p>', $texte);
// Texte aligné à droite : [right]Texte[/right]
$texte = preg_replace('#\[right\](.+)\[/right\]#isU', '<p style="text-align : center;">$1</p>', $texte);
// Texte justifié : [justify]Texte[/justify]
$texte = preg_replace('#\[justify\](.+)\[/justify\]#isU', '<p style="text-align : center;">$1</p>', $texte);
// Insertion d'une ligne horizontale : [hr]
$texte = preg_replace('#\[hr\]#i', '<hr/>', $texte);
// Indice : [sub]Texte en indice[/sub]
$texte = preg_replace('#\[sub\](.+)\[/sub\]#isU', '<sub>$1</sub>', $texte);
// Exposant : [sup]Texte en exposant[/sup]
$texte = preg_replace('#\[sup\](.+)\[/sup\]#isU', '<sup>$1</sup>', $texte);
// [code]echo "Un peu de code PHP par exemple";[/code]
$texte = preg_replace('#\[code\](.+)\[/code\]#isU', '<span style="font-family : courrier;">$1</span>', $texte);
// Insertion d'une image : [img]URL de l'image[/img]
$texte = preg_replace('#\[img\](.+)\[/img\]#isU', '<img src="$1" alt="" width="" height=""/>', $texte);
// [url]URL du lien[/url]
$texte = preg_replace('#\[url\](.+)\[/url\]#isU', '<a href="$1">$1</a>', $texte);
// [url=URL du lien]Titre du lien[/url]
$texte = preg_replace('#\[url=(.+)\](.+)\[/url\]#isU', '<a href="$1">$2</a>', $texte);
// [email]personne@domain.adr[/email]
$texte = preg_replace('#\[email\](.+)\[/email\]#isU', '<a href="mailto:$1">$1</a>', $texte);
?>


Testons à présent ce code avec le texte suivant :
[i]texte en italique[/i]
[u]texte souligné[/u]
[s]texte barré[/s]
[strike]autre variante du texte barré[/strike]
[color=red]texte de couleur rouge[/color]
[color=green]texte de couleur verte[/color]
[color=blue]texte de couleur bleue[/color]
[color=#1199af]texte de couleur #1199af[/color]

[font=arial]Texte en police Arial[/font]
[font=verdana]Texte en police Verdana[/font]
[font=courrier]Texte en police Courrier[/font]

[size=50]Texte de 50%[/size]
[left]Texte à gauche[/left]
[center]Texte centré[/center]
[right]Texte à droite[/right]
[justify]Texte justifié suffisemment long[/justify]
[hr]
[sub]Indice[/sub]
[sup]Exposant[/sup]
[code]echo "Un peu de code";[/code]
Insertion d'une image par son URL :
[img]http://upload.wikimedia.org/wikipedia/commons/b/bf/Nuvola_apps_kbluebox.png[/img]
Lien sans titre : [url]http://www.google.fr[/url]
Lien avec titre : [url=Google]http://www.google.fr[/url]
Adresse mail : [email]personne@domain.adr[/email]
[center][i][color=red]Texte centré rouge italique + lien :
[url]http://www.google.fr[/url][/color][/i][/center]

Nous obtenons alors le résultat suivant :

texte en italique texte souligné [s]texte barré[/s] ou bien [strike]autre variante du texte barré[/strike]
texte de couleur rouge texte de couleur verte texte de couleur bleue texte de couleur #1199af

Texte en police Arial | Texte en police Verdana | Texte en police Courrier | Texte de 50%

Texte à gauche


Texte centré


Texte à droite


Texte justifié suffisemment long traiter en BBCODE ; Texte justifié suffisemment long traiter en BBCODE ; Texte justifié suffisemment long traiter en BBCODE ; Texte justifié suffisemment long traiter en BBCODE ; Texte justifié suffisemment long traiter en BBCODE ; Texte justifié suffisemment long traiter en BBCODE ;




Texte normalIndice | Texte normalExposant | echo "Un peu de code";
Insertion d'une image par son URL :

Lien sans titre : http://www.google.fr
Lien avec titre : Google
Adresse mail : personne@domain.adr

Texte centré rouge italique + lien : http://www.google.fr


Ainsi, nous voyons qu'il est tout à fait possible d'imbriquer les balises les unes dans les autres en respectant bien les ordres d'ouverture et de fermeture (la première ouverte est la dernière fermée).


Durant ces quelques lignes, j'ai essayé de vous présenter les expressions régulières. Vous avez pu en voir la puissance, et encore, il ne s'agissait que des bases. A présent, je vous laisse continuer d'explorer ce vaste domaine ...


Dernière modification de cette page le 23 janvier 2013 à 21:46
Sauf mention contraire, le contenu de cette page est sous licence Creative Commons Paternité et Conditions de partage à l'identique
Page générée en 8169.776 millisecondes | Votre adresse IP : 10.3.51.105 via 216.73.216.170 | Me contacter

             
Impossible de se connecter : Access denied for user 'wxfrantz'@'172.20.245.55' (using password: YES)