正则表达式在大括号之间提取文本

时间:2015-09-30 12:59:07

标签: php regex

我试图在PHP中的花括号之间提取文本。 e.g

  

欢迎{$ user.first_name}加入{$ site}版本1.5。您的用户名   是{$ user.username}。您目前的声誉是{$ user.reputation.name}

我使用了\{\$(.*?)\},在某些情况下效果很好。匹配:

  • {$ user.first_name}
  • {$ site}
  • {$ user.username}
  • {$ user.reputation.name}

但现在我想只匹配有单个或多个的文本。 (点)括号内。即对于上面的字符串,我应该只能匹配:

  • {$ user.first_name}
  • {$ user.username}
  • {$ user.reputation.name}

请帮我实现这个目标!在此先感谢。

2 个答案:

答案 0 :(得分:5)

您可以使用

\{\$([^.{}]+(?:\.[^.{}]+)+)\}

请参阅regex demo

请注意,我使用的是与.*?[^.{}]或{{1}以外的任何字符匹配的否定字符类.,而不是延迟点匹配{。 }。因此,我们匹配任何不包含}的块,并且仍在括号内。

正则表达式分解:

  • . - 文字\{\$
  • {$ - 第1组匹配
    • ([^.{}]+(?:\.[^.{}]+)+) - 除[^.{}]+.{
    • 以外的1个或多个字符
    • } - 1个或更多(由于(?:\.[^.{}]+)+)序列
      • + - 一个文字点
      • \. - 除[^.{}]+.{
      • 以外的1个或多个字符
  • } - 文字\}

IDEONE demo

}

答案 1 :(得分:2)

你可以使用这种模式:

~{\$([^}.]*+[^}]+)}~

[^}.]*+具有占有量词,无法返回字符,因此[^}]+只能将点匹配为第一个字符。