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...

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.

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

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

$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

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');
Portrait de Anonyme

Très intéressant, un petit

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.

Portrait de Anonyme

Beaux exemples en effet,

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

Portrait de Anonyme

Très bien ce petit

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>(.*)<\/vignette>/emisU";
$replace = "'<vignette>'.basename('\\1').'</vignette>'"
preg_replace($pattern,$replace,$xml);

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

Portrait de Anonyme

Très intéressant en

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, "<br />\n");
    echo $newtext;
?> 

Affiche
Portez ce vieux
whisky au juge
blond qui fume.

Portrait de Maxence Delannoy

Utiliser wordwrap c'est pas

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

Poster un nouveau commentaire

Le contenu de ce champ ne sera pas montré publiquement. If you have a Gravatar account, used to display your avatar.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. The supported tag styles are: <foo>, [foo].

Plus d'informations sur les options de formatage

CAPTCHA
La vérification ne tient pas compte des minuscules ou des majuscules.
Image CAPTCHA
Enter the characters shown in the image.