我试图在PHP中的花括号之间提取文本。 e.g
欢迎{$ user.first_name}加入{$ site}版本1.5。您的用户名 是{$ user.username}。您目前的声誉是{$ user.reputation.name}
我使用了\{\$(.*?)\}
,在某些情况下效果很好。匹配:
但现在我想只匹配有单个或多个的文本。 (点)括号内。即对于上面的字符串,我应该只能匹配:
请帮我实现这个目标!在此先感谢。
答案 0 :(得分:5)
您可以使用
\{\$([^.{}]+(?:\.[^.{}]+)+)\}
请参阅regex demo
请注意,我使用的是与.*?
,[^.{}]
或{{1}以外的任何字符匹配的否定字符类.
,而不是延迟点匹配{
。 }。因此,我们匹配任何不包含}
的块,并且仍在括号内。
正则表达式分解:
.
- 文字\{\$
{$
- 第1组匹配
([^.{}]+(?:\.[^.{}]+)+)
- 除[^.{}]+
,.
或{
}
- 1个或更多(由于(?:\.[^.{}]+)+
)序列
+
- 一个文字点\.
- 除[^.{}]+
,.
或{
}
- 文字\}
}
答案 1 :(得分:2)
你可以使用这种模式:
~{\$([^}.]*+[^}]+)}~
[^}.]*+
具有占有量词,无法返回字符,因此[^}]+
只能将点匹配为第一个字符。