İç içe şablonlar

Sınırsız iç içe yaylı ayraçların kullanıldığı bir şablonu yaylı ayraçlar arasındaki bir dizgeyle eşleştirme sorununu ele alalım. Ardışık işlem haricinde yapılabilecek en iyi şey iç içe sabit bir derinliğe kadar eşleşebilecek bir şablon kullanmaktır. Sabit olmayan derinlikli iç içe şablonları işlemek mümkün değildir. Perl'in 5.6 sürümü, ardışık (iç içe) düzenli ifadelere izin veren deneysel bir oluşuma sahiptir. Belli bir ardışıklık durumu için özel bir öğe, (?R) öğesi sağlanmıştır. Bu PCRE şablonu yaylı ayraçlarla ilgili bu sorunu çözmektedir: \( ( (?>[^()]+) | (?R) )* \) (Boşlukların gözardı edilmesini sağlayan PCRE_EXTENDED seçeneğinin etkin olduğu varsayılmıştır.)

İlk eşleşme bir açan yaylı ayraçla olur. Sonraki eşleşme, ya yaylı ayraçlar içine alınmamış bir dizi alt dizgeyle olur ya da şablonun kendisi ardışık olarak (doğru olarak yaylı ayraçlar içine alınmış alt dizgelerle) eşleşir. Ve son eşleşme bir kapatan yaylı ayraçla olur.

Örnek olarak verdiğimiz bu şablon sınırsız sayıda iç içe yineleme içerir; dolayısıyla şablon, eşleşmeyeceği dizgelere uygulandığında, yaylı ayraç içine alınmamış dizgelerle eşleşmek için sadece bir kerelik alt şablonların kullanımı önem kazanır. Bu duruma bir örnek olarak çabuk bir eşleşmemeyle sonuçlanan şu dizge verilebilir: (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()

Bununla birlikte, sadece bir kerelik alt şablon kullanılmazsa eşleştirme işlemi çok uzun sürecektir. Bunun sebebi, eşleşmeye konu dizgeyi çok çeşitli şekillerde bölen + ve * yinelemelerinin olması ve bir başarısızlık raporlamadan önce bunların hepsinin denenmesi gereğidir.

Herhangi bir yakalama alt şablonu için belirlenmiş değerler, alt şablon değerinin atandığı ardışık işlemin en dış seviyesindeki değerlerdir. Eğer yukardaki şablon, (ab(cd)ef) dizgesiyle eşleştirilmeye çalışılırsa yakalanan ayraçlı değer, en üst seviyede elde edilen son değer olan "ef" olur. Eğer başka yaylı ayraçlar da eklenirse, \( ( ( (?>[^()]+) | (?R) )* ) \) şablonu ile yakalanan dizge, en üst seviye yaylı ayraçların içindeki "ab(cd)ef" olur. Eğer bir şablonda 15'ten fazla yakalayan yaylı ayraç varsa, PCRE ardışık bir işlem sırasında veriyi saklamak için pcre_malloc ile ayırarak ve işi bitince pcre_free ile serbest bırakarak fazladan bellek sağlamak zorundadır. Eğer bu bellek ayrılamazsa, bir ardışık işlem sırasında bellek yetersiz hatası vermek mümkün olmadığından veriyi, sadece ilk 15 yakalayan yaylı ayraç için saklar.

PHP 4.3.3'ten beri, (?1), (?2) ve benzerleri ardışık alt şablonlarda da kullanılabilmektedir. Ayrıca, (?P>isim) veya (?P&isim) isimli alt şablonlarını da kullanmak mümkündür.

İsimli veya numararalı bir ardışık alt şablon gönderim sözdizimi, gönderimde bulunduğu yaylı ayraçların dışında kullanılmışsa bir programlama dilindeki bir alt yordam gibi işlem yapar. Önceki örneklerden birinde, (sens|respons)e and \1ibility şablonu "sense and sensibility" ve "response and responsibility" ile eşleşiyor, fakat "sense and responsibility" ile eşleşmiyordu. Eğer (sens|respons)e and (?1)ibility şablonu kullanılmış olsaydı diğer iki dizgeyle birlikte "sense and responsibility" dizgesi de eşleşecekti. Böyle gönderimlerin, yine de atıfta bulunduğu alt şablondan sonra gelmesi gerekir.

Eşleşmeye konu dizgenin azami uzunluğu bir tamsayı değişkenin tutabileceği en büyük pozitif tamsayı kadar olabilirse de PCRE ardışık işlem yaparak sonsuz sayıda yinelemeyi ve alt şablonu işleyebilir. Bu bakımdan, belli bir şablon tarafından işlenebilecek bir dizgenin uzunluğunu sınırlayan şey aslında, kullanılabilecek yığıtın büyüklüğüdür.