J'aimerais savoir s'il existe un moyen simple d'utiliser le motif correspondant dans un par exemple p> 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> Preg_replace code> comme index de la matrice de valeur de remplacement.
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 Réponses :
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 code> pour évaluer la chaîne de remplacement (bien que notez que le modificateur
E code> est obsolète, la fonction de rappel est donc une meilleure solution). p>
de ma tête:
Cheers - a dû le changer légèrement \ {([A-Z _] *) \} code> et
$ data_array [$ m [1]]; code>
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_
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
Utiliser
preg_replace_callback () code>
Dans ce cas (vous filtrez déjà les données d'entrée), vous avez peut-être utilisé le modificateur
/ E CODE> (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 code>. Veillez également à ce que vous avez également besoin de paranthèse pour un groupe de capture
/ \ {([a-z _] *) \} / i code>.
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)