preg_replace_callback

(PHP 4 >= 4.0.5, PHP 5)

preg_replace_callback --  Rechercher/remplacer avec une expression rationnelle et fonction de callback

Description

mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )

Le comportement de preg_replace_callback() est presque identique à celui de preg_replace(), hormis le fait qu'à la place du paramètre replacement, il faut spécifier une fonction de callback callback qui sera appelée, avec les éléments trouvés en arguments. Cette fonction retourne alors la chaîne de remplacement.

Exemple 1. Exemple avec preg_replace_callback()

<?php
// Ce texte était vrai en 2002
// nous voulons le mettre a jour pour 2003
$text = "Le premier avril est le 01/04/2002\n";  
$text.= "Le dernier no&Icirc;l était le 25/12/2001\n";  
  
// Fonction de callback
function next_year($matches) {
  
// comme d'habitude : $matches[0] représente la valeur totale
  // $matches[1] représente la première parenthèse capturante
  
return $matches[1].($matches[2]+1);
}

echo
preg_replace_callback(
       
"|(\d{2}/\d{2}/)(\d{4})|",
       
"next_year",
       
$text);

// retourne ceci :
// Le premier avril est le 01/04/2003
// Le dernier no&Icirc;l était le 25/12/2002
?>

Vous aurez souvent besoin de la fonction callback avec preg_replace_callback() à un seul endroit. Dans ce cas, vous pouvez simplement utiliser la fonction create_function() pour déclarer une fonction anonyme comme fonction de callback pour preg_replace_callback(). En faisant cela, vous concentrez toutes les routines liées à votre remplacement à un seul endroit, et nous ne polluez par votre espace de noms de fonctions avec des fonctions à usage unique.

Exemple 2. Exemples avec preg_replace_callback() et create_function()

<?php
// Un filtre de ligne de commande Unix pour convertir les lettres
// en majuscule de début des paragraphe en minuscules

$fp = fopen("php://stdin", "r") or die("Impossible de lire la ligne de commande");
while (!
feof($fp)) {
    
$line = fgets($fp);
    
$line = preg_replace_callback(
      
'|<p>\s*\w|',
        
create_function(
         
// Les guillemets simples sont très importants ici
         // ou bien il faut protéger les caractères $ avec \$
         
'$matches',
         
'return strtolower($matches[0]);'
         
),
       
$line
       
);
    echo
$line;
}
fclose($fp);
?>

Voir aussi preg_replace() et create_function().