I\'m trying to do a PHP regular expression but i can\'t find the right way ...
Imagine I have this string: \"hello, my {{name is Peter}} and {{I want to eat chocolat
Use
"/{{(.*?)}}/"
The expression ".*"
is greedy, taking as many characters as possible.
If you use ".*?"
is takes as little characters as possible, that is it stops at the first set of closing brackets.
This worked for me.
$subject = 'Hello {{name}}, here is an email {{email}} and phone # {{phone}}';
$replace = array(
'{{name}}' => 'Bob',
'{{email}}' => 'email@me.com',
'{{phone}}' => '5155554455'
);
$output = preg_replace_callback('{{{?(#[a-z]+ )?[a-z]+.[a-z]*}?}}', function($match) use ($replace) {
if(isset($replace[$match[0]])){
return ($replace[$match[0]]);
} else {
return($match[0]);
}
}, $subject);
var_dump($output);
You want "ungreedy matching": preg_match("/{{(.*?)?}}/", $string)
.
Note the first question mark - a regex, by default, is "greedy": given multiple ways to match, it matches as much text as it possibly can. Adding the question mark will make it ungreedy, so if there are multiple ways to match, it will match as few characters as it possibly can.
EDITED
As non-greedy matching seems to be faster than negated one (see here), I change my answer too. Thought it was the other way round...
preg_match("/\{\{(.*?)\}\}/", $string)
You might want to use preg_match_all
to get all matches
The PCRE functions a greedy by default. That means, that the engine always tries to match as much characters as possible. The solution is simple: Just tell him to act non-greedy with the U
modifier
/{{(.+)}}/U
http://php.net/reference.pcre.pattern.modifiers