7

preg_replace一致したパターンを置換値配列のインデックスとして使用する簡単な方法があるかどうかを知りたいです。

例えば

preg_replace("/\{[a-z_]*\}/i", "{$data_array[\1]}", $string);

{xxx} を検索し、$data_array['xxx'] の値に置き換えます。xxx はパターンです。

しかし、この式は無効な php として機能しません。

以下の関数を書いたのですが、簡単にできるのか知りたいです。コールバックを使用することもできますが、$data_array をコールバックに渡すにはどうすればよいでしょうか?

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);
}
4

3 に答える 3

1

連想配列の置換 - 一致するフラグメントが見つからない場合は保持:

$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_

*注意、「_no_match_」には変換がありませんが、正規表現中に一致しますが、そのキーは保持されます。

于 2014-05-03T00:17:24.013 に答える