(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)
preg_replace_callback — Rechercher et remplacer par expression rationnelle standard en utilisant une fonction de callback
$pattern
,$callback
,$subject
,$limit
= -1,&$count
= null
,$flags
= 0
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 rappel callback
qui sera appelée, avec les éléments trouvés en arguments.
pattern
Le masque à chercher. Il peut être une chaîne de caractères ou un tableau contenant des chaînes.
callback
La fonction de rappel qui recevra le tableau d'éléments
trouvés dans la chaîne subject
.
La fonction de rappel doit retourner la chaîne de
remplacement. Voici la signature de la fonction de rappel :
$matches
): string
Vous aurez souvent besoin de la fonction callback
avec preg_replace_callback() à un seul endroit.
Dans ce cas, vous pouvez simplement utiliser une
fonction anonyme
pour déclarer une fonction de rappel pour la fonction
preg_replace_callback().
En faisant cela, vous concentrez toutes les routines liées à
votre remplacement à un seul endroit, et vous ne polluez pas
votre espace de noms de fonctions avec des fonctions à usage unique.
Exemple #1 preg_replace_callback() et fonction anonyme
<?php
// Un filtre de ligne de commande Unix pour convertir la première lettre
// des paragraphes (commençant par "<p>") en minuscule
$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|',
function ($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.
flags
flags
peut être une combinaison des drapeaux
PREG_OFFSET_CAPTURE
et
PREG_UNMATCHED_AS_NULL
, qui influence le format
du tableau de correspondances.
Voir la description de preg_match() pour plus de détail.
preg_replace_callback() retourne un tableau si le paramètre
subject
est un tableau, ou, sinon, une chaîne de caractères.
Si une erreur survient, la valeur retournée sera null
.
Si des correspondances sont trouvées, le nouveau sujet sera retourné, sinon
subject
sera retourné inchangé.
Si le masque regex passé ne compile pas à une regex valide, une E_WARNING
est émise.
Version | Description |
---|---|
7.4.0 |
Le paramètre flags a été ajouté.
|
Exemple #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
Exemple #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;
?>