2013-04-26 14 views
7

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

xxxはパターンである

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

{XXX}を検索し、$ data_arrayの値に置き換え[ '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); 
} 
+2

'preg_replace_callback()'を使用してください – HamZa

+1

この場合(入力データをフィルタリング済みです)、 '/ e'修飾子を使用することができます(あなたのcurly文字列式には配列キー引用符が必要です)。しかし、これは今では禁止されており、 'p_r_callback'よりも利点が限られています。キャプチャグループ '/ \ {([a-z _] *)\}/i'に対してもパラテーシスが必要であることに注意してください。 – mario

+1

乾杯HamZa。私はpreg_replace_callback()について知っていましたが、データ配列を渡す方法が不明でした。 (質問で) – Waygood

答えて

8

preg_replace_callback("/\{([a-z_]*)\}/i", function($m) use($data_array){ 
    return $data_array[$m[1]]; 
}, $string); 

:上記の関数は、PHP 5.3+が必要です。

+1

乾杯 - ちょっと変わった\ {([a-z _] *)\} 'と' $ data_array [$ m [1]]; ' – Waygood

+0

頭がいいよ! ;) – Jpsy

0

あなたがpreg_replace_callbackを使用していて、その配列のインデックスを使用することができます関数を記述、または他のあなたが置換文字列を評価するためにe修飾子を使用することができますすることができます(ただしe修飾子が廃止されましたことに注意してくださいので、コールバック関数よりよい解決策です)。私の頭から

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_」は翻訳を欠いているが、それは正規表現の間に一致しますが、 そのキーを保持しますthatsの。

+0

これは@Hamzaの解決策です。特定の一致に対してインデックスが見つからなかった場合には破損する可能性があります。 – Miguel

+0

ねえ、そこに!ニースの解決策、私は余分なチェックを含めておくべきだった。 +1 – HamZa

関連する問題