PHP : 5 exemples d'utilisation des expressions régulières

Une expression régulière infernale

On peut tout faire
Avec les expressions régulières
Même des vers...

Regrouper des caractères

Pour faciliter la lecture d'un numéro de téléphone, d'un numéro SIREN...

<?php
function groupChars($text$groupLength 3)
{
    while(
preg_match('/(\S+)(\S{' $groupLength '})/'$text$matches)) {
        
$text str_replace($matches[0], $matches[1] . ' ' $matches[2], $text);
    }
    return 
$text;
}

echo 
groupChars('0102030405'2); // Affiche 01 02 03 04 05

echo groupChars('123456789'3); // Affiche 123 456 789
?>

Mettre en surbrillance un mot dans une phrase

Utile pour mettre en évidence les termes recherchés dans un résultat de recherche.

<?php
function highlight($search$text)
{
    
$words preg_split('/\s+/'$search);
    foreach (
$words as &$word) {
        
$word preg_quote($word'/');
    }
    return 
preg_replace('/(' implode($words'|') . ')/i''<em>\1</em>'$text);
}

// Affiche C'est l'<em>esprit</em>, et lui seul, qui nous enchaine ou nous libère.
echo highlight('esprit''C\'est l\'esprit, et lui seul, qui nous enchaine ou nous libère.');

// Affiche C'est l'esprit, et lui seul, qui <em>nous</em> enchaine ou <em>nous</em> libère.
echo highlight('nous''C\'est l\'esprit, et lui seul, qui nous enchaine ou nous libère.');

// Affiche C'est l'esprit, et lui seul, qui nous <em>enchaine</em> ou nous <em>libère</em>.
echo highlight('enchaine libère''C\'est l\'esprit, et lui seul, qui nous enchaine ou nous libère.');
?>

Supprimer les accents

<?php
function removeDiacritics($str)
{
    
$str str_ireplace(array('²''³''^2''^3''ç''œ'), array('2''3''2''3''c''oe'), $str);
    return 
preg_replace(array('/[àáâãäå]/iu''/[èéêë]/iu''/[ìíîï]/iu''/[óôõöø]/iu''/[ùúûü]/iu'), array('a''e''i''o''u'), $str);
}

echo 
removeDiacritics('Déjà'); // Affiche deja

echo removeDiacritics('œuf'); // Affiche oeuf
?>

Supprimer les espaces multiples et les retours à la ligne

Pour afficher par exemple une adresse sur une seule ligne

<?php
$address 
"999 rue   du   Général de Gaulle\n59000 LILLE";

// Affiche 999 rue du Général de Gaulle 59000 LILLE sur une seule ligne
echo preg_replace('/\s+/'' '$address);
?>

Transformer des URLs en liens

<?php
function findLinks($text)
{
    return 
preg_replace('/(\w+:\/\/[\w\d\.\-\/]+)/''<a href="$1">$1</a>'$text);
}

// Affiche L'URL de ce blog : <a href="http://wiip.fr">http://wiip.fr</a>
echo findLinks('L\'URL de ce blog : http://wiip.fr');
?>

Etiquettes:

Comments

Très intéressant, un petit rappel fait du bien sur les expressions régulières (surtout sur l'utilisation du regsplit). On peut réellement tout faire avec des regexp et une fois que l'on maitrise un minimum on se fait plaisir. Surtout que tous les langages ont leurs moteurs de regexp.

Beaux exemples en effet, merci !
Il y a également de bonnes astuces pour la manipulation de texte avec des regexp dans le TextHelper de CakePHP : http://api.cakephp.org/view_source/text-helper/ ... la plupart sont réutilisables telles quelles.

Pierre

Très bien ce petit rappel.

Une focntionnalité que j'ai utilisé la semaine dernière.
Le remplacement d'un chemin d'une vignette dans un xml par uniquement la vignette.

Plutôt que de parcourir le DOM, j'ai utilisé une fonctionnalité de preg_replace permettant d'avoir du code php

Cela donne ca :

$pattern = "/(.*)<\/vignette>/emisU";
$replace = "''.basename('\\1').''"
preg_replace($pattern,$replace,$xml);

Rapide, un peu dur à relire mais avec un peu de doc ca passe ;)

Très intéressant en effet.
Juste pour le groupage de caractères, il existe aussi la fonction wordwrap qui semble AMHA moins "cochon" que ta solution.
Je l'utilise justement pour formatter mes numéros de téléphone, SIRENs, N° SS ....

Issu de la doc PHP :

<?php
$text = "Portez ce vieux whisky au juge blond qui fume.";
$newtext = wordwrap($text, 20, "\n");
echo $newtext;
?>

Affiche
Portez ce vieux
whisky au juge
blond qui fume.

Utiliser wordwrap c'est pas bête effectivement. Il faut noter que les deux méthodes fonctionnent différemment quand la longueur du texte à formater n'est pas un multiple de la longueur du groupe :


echo groupChars('1234567'); // Affiche 1 234 567
echo wordwrap('1234567', 3, ' ', true); // Affiche 123 456 7

Add new comment