1

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

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

问题是它从头到尾匹配整个事情。这显然意味着它不是在第一次出现}而是在最后一次出现时停止。我怎样才能匹配那些?

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

4

4 回答 4

2

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

它查找不是 a }, between {!and的字符}

于 2013-06-12T11:25:15.613 回答
1

试试这个正则表达式:

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

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

在示例中:

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

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

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

在我的模式中:

[^\{]这部分也存在,+这意味着贪婪,但我已经限制它匹配直到{由于^登录字符类。

希望对您有所帮助!

于 2013-06-12T11:29:46.050 回答
1

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

$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);
于 2013-06-12T11:41:13.237 回答
0

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

preg_match_all("/\{\!.+?}/",$text,$var);

我放错了?运营商第一。PHP 理解 ? 运算符,它完全符合您的要求,它将匹配限制为第一次出现。

嗨。

于 2013-06-12T11:18:45.397 回答