Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于在大括号之间提取文本的正则表达式_Php_Regex - Fatal编程技术网

Php 用于在大括号之间提取文本的正则表达式

Php 用于在大括号之间提取文本的正则表达式,php,regex,Php,Regex,我试图在PHP中提取大括号之间的文本。e、 g 欢迎{$user.first_name}访问{$site}1.5版。您的用户名 是{$user.username}。您当前的声誉为{$user.声誉.name} 我使用了\{\$(.*?)\},在某些情况下效果很好。这符合: {$user.first_name} {$site} {$user.username} {$user.reputation.name} 但现在我只想匹配具有单个或多个字符的文本。(点)在支架内。i、 e对于上述字符串,我只

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

欢迎{$user.first_name}访问{$site}1.5版。您的用户名 是{$user.username}。您当前的声誉为{$user.声誉.name}

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

  • {$user.first_name}
  • {$site}
  • {$user.username}
  • {$user.reputation.name}
但现在我只想匹配具有单个或多个字符的文本。(点)在支架内。i、 e对于上述字符串,我只能匹配:

  • {$user.first_name}
  • {$user.username}
  • {$user.reputation.name}
请帮助我实现这个目标!提前感谢。

您可以使用

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

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

正则表达式细分:

  • \{\$
    -文字
    {$
  • ([^.{}]+(?:\.[^.{}]+)+)
    -组1匹配
    • [^.{}]+
      -1个或多个字符,而不是
      {
      }
    • (?:\.[^.{}]+)+
      -1个或多个(由于
      +
      )序列
      • \。
        -文字点
      • [^.{}]+
        -1个或多个字符,而不是
        {
        }
  • \}
    -文字
    }
:


您可以使用以下模式:

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

[^}.]*+
有所有格量词,不能返回字符,所以
[^}]+
只能匹配一个点作为第一个字符。

太好了!工作起来很有魅力。非常感谢您的快速回复和完美回答。:-)谢谢。将~替换为\后,此表达式也适用于我。我用\{$([^}.]*+[^}]+)\}来测试你的表达式。@AmitKumar:你不需要做这个替换。您也不需要避开花括号。\{$([^}.]*+[^}]+\}有效,但{$([^}.]*+[^}]+}~在我的PHP测试代码中不起作用。@AmitKumar:
~
是模式分隔符(以及
//code>)是有效的。对不起,是我的错。我把表达式放在/(斜杠)之间,这在本例中是不需要的。再次感谢您的时间和帮助。向上投票
~{\$([^}.]*+[^}]+)}~