正则表达式用于捕获组之间的字符但忽略嵌套组中的字符

时间:2010-04-08 03:35:43

标签: php regex

这是为了使MediaWiki中的“模板”与PHP类似,以使嵌套模板之间的参数有效。

是否可以使用正则表达式来捕获大括号之间出现的所有字符,但如果它出现在嵌套的大括号中,则会忽略它的出现次数?

| {{ | {{ | }} | | }} |

突出显示:

| {{ *|* {{ | }} *|* *|* }} |

2 个答案:

答案 0 :(得分:0)

m/.*{{([^{]+)}}/

只要'{'不存在,就可以在{{和}}之间捕获一个组 - 语法是perl

尽管使用解析器

可以做得更好

再次编辑。

答案 1 :(得分:0)

不,你必须编写一个无上下文语法(或Perl递归regexps)来解析它。被忽略的嵌套模板是什么?

解析器在伪代码中看起来像这样:

input = "| {{ | {{ | }} | | }} |", pointer = 0;
char = '', results = [];

read_next_char() {
  return input[++ pointer];
}

go_back_one_char() {
  pointer --;
}

while (char = read_next_char()) {
  if (char == '{') {
    if (read_next_char() == '{') InsideBraces();
    else go_back_one_char();
  }
}

InsideBraces(skipping=false) {
  result = "";
  while (char = read_next_char()) {
    if (char == '{') {
      if (read_next_char() == '}') InsideBraces();
      else go_back_one_char();
    } else if (char == '}') {
      if (read_next_char() == '}') break;
      else go_back_one_char();
    } else {
      result += char;
    }
  }
  if (!skipping) results.push(result);
}