Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的正则表达式:采用最短匹配_Php_Regex - Fatal编程技术网

php中的正则表达式:采用最短匹配

php中的正则表达式:采用最短匹配,php,regex,Php,Regex,我试图做一个PHP正则表达式,但我找不到正确的方法 想象一下我有这样一个字符串:“你好,我的{{名字是彼得}}和{{我想吃巧克力}” 我想在{{和}之间扮演角色 但是如果我使用preg\u match(“/\{(.*)\}\}/”,$string) 它返回一个字符串“{名字是彼得}}和{{我想吃巧克力}” 我怎么能告诉你要抓住}的第一个巧合呢 谢谢你使用 "/{{(.*?)}}/" 表达式“*”是贪婪的,需要尽可能多的字符。 如果您使用“*?”is尽可能少地使用字符,也就是说它在第一组结束括号

我试图做一个PHP正则表达式,但我找不到正确的方法

想象一下我有这样一个字符串:“你好,我的{{名字是彼得}}和{{我想吃巧克力}”

我想在{{和}之间扮演角色

但是如果我使用
preg\u match(“/\{(.*)\}\}/”,$string)

它返回一个字符串“{名字是彼得}}和{{我想吃巧克力}”

我怎么能告诉你要抓住}的第一个巧合呢

谢谢你使用

"/{{(.*?)}}/"
表达式
“*”
是贪婪的,需要尽可能多的字符。 如果您使用
“*?”
is尽可能少地使用字符,也就是说它在第一组结束括号处停止。

您想要“取消快速匹配”:
preg\u match(“/{(.*?}}/”,$string)


注意第一个问号——默认情况下,正则表达式是“贪婪的”:给定多种匹配方式,它尽可能多地匹配文本。添加问号将使其不可见,因此如果有多种匹配方式,它将尽可能少地匹配字符。

编辑

由于非贪婪匹配似乎比否定匹配更快(),我也改变了答案。我还以为是另一回事

preg_match("/\{\{(.*?)\}\}/", $string)

您可能希望使用
preg\u match\u all
来获取所有匹配项

默认情况下,PCRE功能为贪婪。这意味着,引擎总是尝试匹配尽可能多的字符。解决办法很简单:只需告诉他用
U
修饰符表现得不贪婪

/{{(.+)}}/U
这对我很有效

$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/1量词完全不同。这里解释了这种行为: