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