7
votes

Preg_Replace à l'aide du modèle comme index du tableau de données de remplacement

J'aimerais savoir s'il existe un moyen simple d'utiliser le motif correspondant dans un Preg_replace code> comme index de la matrice de valeur de remplacement.

par exemple p> xxx PRE>

Rechercher {xxx} et remplacez-le avec la valeur en $ data_array ['' xxx '], où xxx est un motif. p>

mais cette expression ne fonctionne pas comme son PHP invalide . P>

J'ai écrit la fonction suivante, mais j'aimerais savoir s'il est possible de le faire simplement. Je pourrais utiliser un rappel, mais comment puis-je transmettre le $ data_array à cela aussi? P>

function mailmerge($string, $data_array, $tags='{}')
{
    $tag_start=$tags[0];
    $tag_end  =$tags[1];
    if( (!stristr($string, $tag_start)) && (!stristr($string, $tag_end)) ) return $string;

    while(list($key,$value)=each($data_array))
    {
        $patterns[$key]="/".preg_quote($tag_start.$key.$tag_end)."/";
    }
    ksort($patterns);
    ksort($data_array);

    return preg_replace($patterns, $data_array, $string);
}


3 commentaires

Utiliser preg_replace_callback ()


Dans ce cas (vous filtrez déjà les données d'entrée), vous avez peut-être utilisé le modificateur / E (votre expression de chaîne bouclée nécessaire auxquelles des citations de la clé USB sont toujours). Il est actuellement interdit et présente des avantages limités sur p_r_callback . Veillez également à ce que vous avez également besoin de paranthèse pour un groupe de capture / \ {([a-z _] *) \} / i .


Bravo Hamza. Je savais à propos de Preg_replace_callback (), je ne savais tout simplement pas comment transmettre la matrice de données. (dans la question)


3 Réponses :


0
votes

Vous pouvez utiliser Preg_replace_callback et écrire une fonction où vous pouvez utiliser cet index de tableau, sinon vous pouvez Utilisez le modificateur E pour évaluer la chaîne de remplacement (bien que notez que le modificateur E est obsolète, la fonction de rappel est donc une meilleure solution).


0 commentaires

9
votes

de ma tête: xxx

note : la fonction ci-dessus nécessite php 5.3 +.


1 commentaires

Cheers - a dû le changer légèrement \ {([A-Z _] *) \} et $ data_array [$ m [1]];



1
votes

Remplacement de la matrice associative - Gardez des fragments assortis si non trouvé:

$words=array("_saudation_"=>"Hello", "_animal_"=>"cat", "_animal_sound_"=>"MEooow");

$source=" _saudation_! My Animal is a _animal_ and it says _animal_sound_ ,  _no_match_";

echo (preg_replace_callback("/\b_(\w*)_\b/", function($match) use ($words) { if(isset($words[$match[0]])){
return ($words[$match[0]]);}else{
return($match[0]);} 
},  $source));

    //returns:  Hello! My Animal is a cat and it says MEooow ,  _no_match_


2 commentaires

Ceci est une amélioration de la solution @hamza puisque elle briserait si aucun index n'a été trouvé pour un match particulier


Salut! Belle solution, j'aurais dû inclus le chèque supplémentaire aussi. +1