[RESOLU] preg_replace_callback récursif

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] preg_replace_callback récursif

Re: preg_replace_callback récursif

par carte-sd » 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!

Re: preg_replace_callback récursif

par vincent.c » 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.

preg_replace_callback récursif

par carte-sd » 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; ?>