regular expression in php: take the shortest match

前端 未结 5 1519
我寻月下人不归
我寻月下人不归 2021-01-12 05:23

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

相关标签:
5条回答
  • 2021-01-12 05:50

    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.

    0 讨论(0)
  • 2021-01-12 05:58

    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);
    
    0 讨论(0)
  • 2021-01-12 06:06

    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.

    0 讨论(0)
  • 2021-01-12 06:07

    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

    0 讨论(0)
  • 2021-01-12 06:11

    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

    0 讨论(0)
提交回复
热议问题