正则表达式在第一次出现时停止

时间:2013-06-12 11:10:07

标签: php regex

我有一个像{!Hello} there, {!World}这样的字符串。我需要匹配{!Hello}{!World},我的正则表达式是这样的

$text = '{!Hello} there, {!World}';
preg_match_all("/\{\!.+\}/",$text,$var);

问题是它从头到尾匹配整个事物。这显然意味着它不会在}的第一次出现时停止,而是在最后一次出现时停止。我该如何匹配?

编辑:忘记提及我无法使用\ w +,因为括号中的单词可能包含特殊字符。 IT可能类似于{!Email__email@some.domain__IsInvalid}。我需要匹配这整件事

4 个答案:

答案 0 :(得分:2)

您需要的是:/\{\![^\}]*\}/

它会在}{!

之间查找非}的字符

答案 1 :(得分:1)

试试这个正则表达式:

`\{(\![^\{]+)\}`

在您的模式中.+是贪婪的,它将匹配as much as possible。例如:

在示例中:

  

{!Hello}那里,{!World}}

     

{!Hello}那里,{!World}} dsad

粗体部分是您的正则表达式找到的匹配项。

在我的模式中:

[^\{]此部分也与+一起出现,这意味着贪婪,但我限制了匹配,直到{由于^签到字符类。

希望它会对你有所帮助!

答案 2 :(得分:1)

你基本上需要匹配ungreedy:
/\{\!.+?\}/

$text = '{!Hello} there, {!World} foo {!Email__someemail@some.domain__IsInvalid}';
preg_match_all("/\{\!.+?\}/",$text,$var);
print_r($var);

您还可以添加U修饰符(注意它是大写的):
/\{\!.+\}/U

$text = '{!Hello} there, {!World} foo {!Email__someemail@some.domain__IsInvalid}';
preg_match_all("/\{\!.+\}/U",$text,$var);
print_r($var);

答案 3 :(得分:0)

http://phpfiddle.org/lite/code/31z-rtu

preg_match_all("/\{\!.+?}/",$text,$var);
我放错了地方?首先是运营商 PHP理解?运算符,它完全符合您的要求,它将匹配限制为第一次出现。

HIH。