Notice: session_start() [function.session-start]: ps_files_cleanup_dir: opendir(/var/lib/php5) failed: Permission denied (13) in /home/expreg/mvc/main.php on line 43
La fonction preg_replace_callback sur ExpReg

Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

La fonction preg_replace_callback


Le comportement de preg_replace_callback est presque identique à celui de preg_replace, hormis le fait qu'à la place du paramètre remplacement, il faut spécifier une fonction de callback qui sera appelée, avec les éléments trouvés en arguments.
Cette fonction retourne alors la chaîne de remplacement.
Comme un exemple vaut mieux qu'un long discours, il vous suffit d'analyser ceux donnés en-dessous.

Exemples avec preg_replace_callback

Exemple 1


 Récupérer une valeur numérique dans un nom de fichier
Niveau de compréhension :moyen

<?php
$image="image125.jpg";

function ajoute($masque)
{
return $masque[1].($masque[2]+1).$masque[3];
}
$image=preg_replace_callback('`(\w*?)(\d+)?(\.jpg)`','ajoute',$image);

echo $image;

?>

Explication :
Imaginons dans cet exemple un nom de fichier image avec chiffres que l'on doit récupérer et incrémenter d'une unité.
Cet exemple de callback va matcher les parties du nom définies dans le masque.
On va récupérer ces parties séparément, les traiter et reconstituer la chaîne d'origine avec l'incrémentation réalisée.

Exemple 2

Mise en majuscule sur un prénom composé
Niveau de compréhension : facile

<?php
$chaine='Mise en majuscule des initiales sur un prénom composé comme anne-marie.';
function mot_compose($masque){
return ucfirst($masque[1]).'-'.ucfirst($masque[2]);
}
echo preg_replace_callback('`([[:alpha:]]+)-([[:alpha:]]+)`','mot_compose',$chaine);
?>

Explication :
Un autre exemple simple pour illustrer l'emploi de callback.
Ce test porte sur la mise en majuscules des premières lettres d'un prénom composé.

Exemple 3

Césure d'url placée dans un texte
Niveau de compréhension :moyen

<?php
$texte = 'Et voici un lien dans une page <http://www.expreg.com/index.php>
auquel on va appliquer une césure';
function cesure_lien($match) {
return '<a href="'.$match[1].'" target="_blank">'.substr($match[1],0,15).'...</a>';   
}
echo preg_replace_callback('`<((https?|ftp)://\S+)>`', cesure_lien,$texte);

// affichera :  http://www.expr...
?>

Explication :
Une césure de lien dans un texte.
Toute la puissance de preg_replace_callback

Exemple 4

Une coloration syntaxique simple sur le principe de [php] le code [/php]
Niveau de compréhension : moyen

<?php
$ch='un texte avec [php]<?php echo "salut";  ?>[/php] suivi de mots,
puis [php]<?php echo "encore ça en couleur"; ?>[/php] et on termine
avec [php]<?php echo "ceci aussi en couleur"; ?>[/php] et voilà';

function color_code($match)
{
return highlight_string($match[1], TRUE);
}
$chaine=preg_replace_callback('`\[php](.+?)\[/php]`i','color_code',$ch);
echo $chaine;
?>

Explication :
Un simple colorateur syntaxique pour votre code php.
Evite l'emploi de la "mauvaise option" e avec preg_replace.
Ajoutez l'option s pour travailler sur plusieurs lignes.

Cette portion est très simple. Bien qu'elle puisse être utilisée telle qu'elle pour réaliser un colorateur syntaxique, il ne faut pas en attendre des miracles.
Je ne l'ai utilisée ici que pour illustrer la fonction de callback.
ADAM Benjamin 2008 | Admin