在编写自定义小模板引擎的过程中,我希望匹配像
这样的块{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]+
答案 0 :(得分:1)
要匹配至少2个以至少1个空格分隔的单词字符序列,并允许前导和尾随空格,您可以使用
\s*\w+(?:\s+\w+)+\s*
详情:
\s*
- 0+ whitespaces \w+
- 一个或多个单词字符(?:
- 启动用于分组子模式序列的非捕获组*:
\s+
- 一个或多个空格\w+
- 一个或多个单词字符)+
- 该组的一次或多次出现\s*
- 尾随0 +空格字符。整个正则表达式看起来像
{(?!{)(\s*\w+(?:\s+\w+)+\s*)}(?!})(.*?){(?!{)(\w+)}(?!})