我有一个像{!Hello} there, {!World}
这样的字符串。我需要匹配{!Hello}
和{!World}
,我的正则表达式是这样的
$text = '{!Hello} there, {!World}';
preg_match_all("/\{\!.+\}/",$text,$var);
问题是它从头到尾匹配整个事物。这显然意味着它不会在}
的第一次出现时停止,而是在最后一次出现时停止。我该如何匹配?
编辑:忘记提及我无法使用\ w +,因为括号中的单词可能包含特殊字符。 IT可能类似于{!Email__email@some.domain__IsInvalid}
。我需要匹配这整件事
答案 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。