需要第一组正则表达式

时间:2016-12-07 15:49:13

标签: php regex

在编写自定义小模板引擎的过程中,我希望匹配像

这样的块
{foreach foo as bar}
    {bar.name}
{endforeach}

//with regex
preg_match_all('/{(?!{)([\w\s]+)}(?!})(.*?){(?!{)(\w+)}(?!})/us', $string, $matches, PREG_SET_ORDER)

所以第一组必须有[\w\s]+的alnum和whitespace字符 否定预测(?!{)是不允许以{{

开头的块
//so a block like 
{{foreach bla as bla}}
//would not be matched.

问题是这个正则表达式还匹配{var}没有空格。 由于我的第一堂课定义,这是我不明白的 [\w\s]+

1 个答案:

答案 0 :(得分:1)

要匹配至少2个以至少1个空格分隔的单词字符序列,并允许前导和尾随空格,您可以使用

\s*\w+(?:\s+\w+)+\s*

详情:

  • \s* - 0+ whitespaces
  • \w+ - 一个或多个单词字符
  • (?: - 启动用于分组子模式序列的非捕获组*:
    • \s+ - 一个或多个空格
    • \w+ - 一个或多个单词字符
  • )+ - 该组的一次或多次出现
  • \s* - 尾随0 +空格字符。

整个正则表达式看起来像

{(?!{)(\s*\w+(?:\s+\w+)+\s*)}(?!})(.*?){(?!{)(\w+)}(?!})

请参阅updated regex demo