Forum und email

preg_replace_callback

(PHP 4 >= 4.0.5, PHP 5)

preg_replace_callback — Rechercher et remplacer par expression rationnelle standard en utilisant une fonction de callback

Description

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

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.

Liste de paramètres

pattern

Le masque à chercher. Il peut être une chaîne de caractères ou un tableau contenant des chaînes.

callback

Une fonction de callback qui sera appelé et passerz un tableau d'éléments correspondants trouvés dans la chaîne subject . La fonction de callback doit retourner la chaîne de remplacement.

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.

Example#1 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);
?>

subject

La chaîne ou le tableau de chaînes à chercher et à remplacer.

limit

Le nombre maximal de remplacement pour chaque masque dans chaque chaîne subject . Vaut par défaut -1 (aucune limite).

count

Si fournie, cette variable sera remplie avec le nombre de remplacements effectués.

Valeurs de retour

preg_replace_callback() retourne un tableau si le paramètre subject est un tableau, ou, sinon, une chaîne de caractères.

Si des correspondances sont trouvées, le nouveau sujet sera retourné, sinon subject sera retourné, inchangé.

Historique

Version Description
5.1.0 Le paramètre count a été ajouté.

Exemples

Example#2 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 04/01/2002\n";
$text.= "Le dernier noël était le 12/24/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);

?>

L'exemple ci-dessus va afficher :

Le premier avril est le 04/01/2003
Le dernier noël était le 12/24/2002

Example#3 Exemple avec preg_replace_callback() en utilisant une structure récursive pour gérer du BB code

<?php
$input 
"plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";

function 
parseTagsRecursive($input)
{

    
$regex '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';

    if (
is_array($input)) {
        
$input '<div style="margin-left: 10px">'.$input[1].'</div>';
    }

    return 
preg_replace_callback($regex'parseTagsRecursive'$input);
}

$output parseTagsRecursive($input);

echo 
$output;
?>

Voir aussi