[RESOLU] preg_replace_callback récursif

Eléphant du PHP | 65 Messages

03 nov. 2016, 19:44

Bonsoir,
Je viens vers vous car j'ai trouvé cet exemple sur le site officiel qui fonctionne très bien mais j'aimerais juste comprendre comment le résultat est renvoyé puisque la fonction de callback est rappelée à chaque fois... Pour moi c'est sensé faire une boucle infinie!

Code : Tout sélectionner

<?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; ?>

Petit nouveau ! | 9 Messages

03 nov. 2016, 21:01

Bonsoir,

La fonction preg_replace_callback n'appelle pas la callback à chaque fois. La callback est exécutée uniquement si un résultat est trouvé.

Exemple:
<?php
$input = "Hello World !";

function parseTagsRecursive($input)
{
    echo "parseTagsRecursive executed.\n"; // AFFICHE UN TEXTE DE LOG
    $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);
Ici "parseTagsRecursive executed.\n" ne sera afficher une seule fois, car c'est nous qui en faisons l'appel en dernière ligne du programme.

Si tu ajoutes un message de log dans ton premier exemple, tu verras qu'il passe trois fois: une fois car on l'appelle en fin de programme et deux fois car il y a bien deux occurrences à remplacer.

Bonne soirée.
Vincent Chapron
Formateur et Consultant PHP/JS @Openska
Twitter: @vincent_chapron

Eléphant du PHP | 65 Messages

03 nov. 2016, 22:37

a... Je savais pas pour la callback, je pensais qu'elle était exécutée quoi qu'il arrive. Merci!