PCRE: kod bloğu için eşleşen ayracı bul

5 Cevap php

Karşılaştığı bir karakterin kaç tekrarlarını (n) saymak için, ve buldum n başka bir karakter oluşumları (özellikle { sonra arama durdurmak ve {[(1), PCRE düzenli ifadeler için bir yolu var mı ]}).

Bu (veya kod blokları içlerinde yuvalanmış yok olabilir ki) kod blokları kapmak etmektir.

O basit yaparsa, giriş parantez dışındaki tek karakterler ile rakam, kolonlar ve virgül vardır, bir tek satır dize olacaktır. Kod blokları bile ekstre edilecek denenmeden önce giriş aşağıdaki kriterleri geçmelidir:

$regex = '%^(\\d|\\:|\\{|\\}|,)*$%';

Tüm parantez eşleşen bir çift var, ve doğru iç içe olacaktır.

Ben dizesinde her karakteri kontrol ve omurganın her geçtiği saymak için bir senaryo yazmaya başlamadan önce bu elde edilebilir olmadığını bilmek istiyorum. Bu dizeleri boyutta birkaç kilobayt olabilir gibi düzenli ifadeler dost çok daha fazla bellek olurdu!

Teşekkürler, mniz.

Solution

http://stackoverflow.com/questions/2344747/pcre-lazy-and-greedy-at-the-same-time-possessive-quantifiers/2353753#2353753

5 Cevap

pcre recursive patterns, bu nedenle böyle bir şey yapabilirsiniz

$code_is_valid = preg_match('~^({ ( (?>[^{}]+) | (?1) )* })$~x', '{' . $code .'}');

başka şey, ben bu özellikle büyük dizeleri, daha hızlı veya daha az bellek tüketen basit bir sayaç daha olacağını sanmıyorum.

ve bu bir dize tüm (geçerli) codeblocks bulmak için nasıl

preg_match_all('~ { ( (?>[^{}]+) | (?R) )* } ~x', $input, $blocks);
print_r($blocks);

Bu, düzenli ifadeler için not iyi tam olarak ne olduğunu. Bu klasik bir örnek.

Sadece karakteri dize karakter üzerinde yineleme ve yuvalanma düzeyine sayısını tutmak gerekir.

$regex='%^(\\d|\\:|\\{|\\}|,){0,25)$%';
preg_match($regex,$target,$matches);

Nerede: İlk satırda 25 yineleme sayısını belirtir. sonra kontrol edin:

$n=count($matches);

Eğer açıklayan dil regular language olmadığından imkansızdır.

Yerine ayrıştırıcı kullanın.

Ben bir çözüm yarattı, ve as an answer on my previous question attılar.

Tüm yardım, mniz için teşekkürler.