Bir grup arasında bir karakteri yakalayan, ancak iç içe bir grup olanları görmezden için regex

2 Cevap php

Benzer bir şey yapmak için bu yuvalanmış şablonları iş arasındaki parametreleri yapmak için PHP ile MediaWiki "şablonlar" için.

Bu parantez iç içe geçmiş bir grup oluşursa parantez ancak bunun görmezden olaylar arasında bir karakterin tüm oluşumları yakalamak için bir regex ile mümkün mü?

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

Vurgulanan:

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

2 Cevap

Hayır, bunu ayrıştırmak için bir bağlam serbest dilbilgisi (veya Perl özyinelemeli İfadelerinin) yazmalısınız. Ne ihmal iç içe şablonları değiştirilir?

Ayrıştırıcı pseudocode bu gibi görünecektir:

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);
}
m/.*{{([^{]+)}}/

sözdizimi Perl - o kadar uzun '{' mevcut değildi {{ve}} arasında bir grubu yakalamak istiyorum

Bu iyi bir çözümleyici ile yapılıyor olsa

tekrar düzenlenebilir.