【问题标题】:Regular expression to extract text between braces正则表达式提取大括号之间的文本
【发布时间】:2015-09-30 12:59:07
【问题描述】:

我正在尝试在 PHP 中提取花括号之间的文本。例如

欢迎 {$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}

请帮助我实现这一目标!提前致谢。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    你可以使用

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

    regex demo

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

    正则表达式分解:

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

    IDEONE demo:

    $re = '/\{\$([^.{}]+(?:\.[^.{}]+)+)\}/'; 
    $str = "Welcome {\$user.first_name} to the {\$site} version 1.5. Your username is {\$user.username}. Your reputation at present is {\$user.reputation.name}"; 
    preg_match_all($re, $str, $matches);
    print_r($matches[1]);
    

    【讨论】:

    • 太棒了!奇迹般有效。非常感谢您的快速回复和完美的回答。 :-)
    【解决方案2】:

    你可以使用这个模式:

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

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

    【讨论】:

    • 非常感谢。在将 ~ 替换为 \ 后,此表达式也适用于我。我用 \{\$([^}.]*+[^}]+)\} 来测试你的表情。
    • @AmitKumar:你不需要做这个替换。您也不需要转义大括号。
    • \{\$([^}.]*+[^}]+)\} 有效,但 ~{\$([^}.]*+[^}]+)}~不在我的 PHP 测试代码中。
    • @AmitKumar: eval.in/442275 regex101.com/r/lE4tP7/1 ~ 是模式分隔符(以及/
    • 是的,有效。对不起我的错。我将表达式放在 / (斜杠)之间,在这种情况下不需要。再次感谢您的时间和帮助。赞成
    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 2011-01-25
    • 2020-03-14
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多