web-dev-qa-db-fra.com

Comment utiliser preg_replace_callback?

J'ai la déclaration HTML suivante

[otsection]Wallpapers[/otsection]
WALLPAPERS GO HERE

[otsection]Videos[/otsection]
VIDEOS GO HERE

Ce que j'essaie de faire est de remplacer les balises [otsection] par un div html. Le hic, c'est que je veux incrémenter l'id de la div de 1-> 2-> 3, etc.

Ainsi, par exemple, la déclaration ci-dessus doit être traduite en

<div class="otsection" id="1">Wallpapers</div>
WALLPAPERS GO HERE

<div class="otsection" id="2">Videos</div>
VIDEOS GO HERE

Pour autant que je puisse faire des recherches, la meilleure façon de le faire est via un preg_replace_callback pour incrémenter la variable id entre chaque remplacement. Mais après 1 heure de travail sur cela, je ne peux pas le faire fonctionner.

Toute aide à cet égard serait très appréciée!

33
Mark

Utilisez le suivant:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is",
    function($m) {
        static $id = 0;
        $id++;
        return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>";
    },
    $in);

Notez en particulier que j'ai utilisé une variable static. Cette variable persiste à travers les appels à la fonction, ce qui signifie qu'elle sera incrémentée à chaque appel de la fonction, ce qui se produit pour chaque correspondance.

Notez également que j'ai ajouté ots à l'ID. Les ID d'élément ne doivent pas commencer par des nombres.


Pour PHP avant 5.3:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is",
    create_function('$m','
        static $id = 0;
        $id++;
        return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>";
    '),
    $in);
46

Remarque : Ce qui suit est destiné à être une réponse générale et n'essaie pas de résoudre le problème spécifique de l'OP car il a déjà été traité avant .

Qu'est-ce que preg_replace_callback()?

Cette fonction est utilisée pour effectuer une recherche et un remplacement d'expression régulière. Il est similaire à str_replace() , mais au lieu de chaînes simples, il recherche un modèle d'expression régulière défini par l'utilisateur, puis applique la fonction de rappel sur les éléments correspondants. La fonction renvoie la chaîne modifiée si des correspondances sont trouvées, sinon une chaîne non modifiée.

Quand dois-je l'utiliser?

preg_replace_callback() est très similaire à preg_replace() - la seule différence est qu'au lieu de spécifier une chaîne de remplacement pour le deuxième paramètre, vous spécifiez un callback une fonction.

Utilisez preg_replace() lorsque vous souhaitez effectuer une recherche regex simple et remplacer. Utilisez preg_replace_callback() lorsque vous voulez faire plus que simplement remplacer. Voir l'exemple ci-dessous pour comprendre comment cela fonctionne.

Comment l'utiliser?

Voici un exemple pour illustrer l'utilisation de la fonction. Ici, nous essayons de convertir une chaîne de date du format YYYY-MM-DD En DD-MM-YYYY.

// our date string
$string  = '2014-02-22';

// search pattern
$pattern = '~(\d{4})-(\d{2})-(\d{2})~';

// the function call
$result = preg_replace_callback($pattern, 'callback', $string);

// the callback function
function callback ($matches) {
    print_r($matches);
    return $matches[3].'-'.$matches[2].'-'.$matches[1];
}

echo $result;

Ici, notre modèle d'expression régulière recherche une chaîne de date au format NNNN-NN-NNN pourrait être un chiffre compris entre 0 - 9 (\d Est une représentation abrégée de la classe de caractères [0-9]). La fonction de rappel sera appelée et transmettra un tableau d'éléments correspondants dans la chaîne donnée.

Le résultat final sera:

22-02-2014

Remarque: L'exemple ci-dessus est uniquement à des fins d'illustration. Vous ne devez pas utiliser pour analyser les dates. Utilisez plutôt DateTime::createFromFormat() et DateTime::format() . Cette question a plus de détails.

26
Amal Murali