Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

preg_replace using pattern as index of replacement data array

I would like to know if there is a simple way to use the matched pattern in a preg_replace as an index for the replacement value array.

e.g.

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

Search for {xxx} and replace it with the value in $data_array['xxx'], where xxx is a pattern.

But this expression does not work as its invalid php.

I have written the following function, but I'd like to know if it is possible to do it simply. I could use a callback, but how would I pass the $data_array to it too?

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);
}
like image 725
Waygood Avatar asked Apr 26 '13 13:04

Waygood


1 Answers

From my head:

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

Note: The above function requires PHP 5.3+.

like image 95
HamZa Avatar answered Sep 24 '22 05:09

HamZa