a_m0d
a_m0d

Reputation: 12205

PHP regex templating - find all occurrences of {{var}}

I need some help with creating a regex for my php script. Basically, I have an associative array containing my data, and I want to use preg_replace to replace some place-holders with real data. The input would be something like this:

<td>{{address}}</td><td>{{fixDate}}</td><td>{{measureDate}}</td><td>{{builder}}</td>

I don't want to use str_replace, because the array may hold many more items than I need.

If I understand correctly, preg_replace is able to take the text that it finds from the regex, and replace it with the value of that key in the array, e.g.

<td>{{address}}</td>

get replaced with the value of $replace['address']. Is this true, or did I misread the php docs?

If it is true, could someone please help show me a regex that will parse this for me (would appreciate it if you also explain how it works, since I am not very good with regexes yet).

Many thanks.

Upvotes: 5

Views: 4440

Answers (3)

mleko
mleko

Reputation: 12243

To not have to use global variables and gracefully handle missing keys you can use

function render($template, $vars) {
        return \preg_replace_callback("!{{\s*(?P<key>[a-zA-Z0-9_-]+?)\s*}}!", function($match) use($vars){
            return isset($vars[$match["key"]]) ? $vars[$match["key"]] : $match[0];
        }, $template);
    }

Upvotes: 0

cletus
cletus

Reputation: 625217

Use preg_replace_callback(). It's incredibly useful for this kind of thing.

$replace_values = array(
  'test' => 'test two',
);
$result = preg_replace_callback('!\{\{(\w+)\}\}!', 'replace_value', $input);

function replace_value($matches) {
  global $replace_values;
  return $replace_values[$matches[1]];
}

Basically this says find all occurrences of {{...}} containing word characters and replace that value with the value from a lookup table (being the global $replace_values).

Upvotes: 10

xyz
xyz

Reputation: 1192

For well-formed HTML/XML parsing, consider using the Document Object Model (DOM) in conjunction with XPath. It's much more fun to use than regexes for that sort of thing.

Upvotes: 0

Related Questions