Geriye Gönderimler

Bir karakter sınıfının dışında, bir tersbölü ile öncelenmiş 0'dan büyük bir sayı, şablonda kendinden önce yaylı ayraçlarla gruplanmış alt şablonlar varsa, bunlar arasından kendisiyle ilgili yakalayan alt şablona gönderim olarak ele alınır.

Ancak, tersbölüyü takibeden onluk sayı 10'dan küçükse, bu daima bir geriye gönderim olarak ele alınır ve şablonun öncesinde bir yakalayan alt şablon başlatan bundan daha az sayıda yaylı ayraç varsa işlem bir hata ile sonuçlanır. Başka bir deyişle, 10'dan küçük numaralı yakalayan alt şablonları kapatan ayraçların kendileriyle ilgili geriye gönderimlerin öncesinde bulunma koşulu yoktur. Tersbölüyü takibeden rakamların ele alınışları ile ilgili ayrıntılı bilgiyi Tersbölü bölümünde bulabilirsiniz.

Bir geriye gönderimin eşleştiği alt şablon olasılıklar içeriyorsa, geriye gönderim, şablonun kalanının eşleştiği olasılıktan başka bir olasılıkla eşleşmez. Yani, (sens|respons)e and \1ibility şablonu, "sense and sensibility" ve "response and responsibility" ile eşleştiği halde "sense and responsibility" ile eşleşmeyecektir. Harf büyüklüğüne duyarlılık etkin olduğunda geriye gönderim de aynı duyarlılığa sahip olacaktır. Örneğin, ((?i)rah)\s+\1 şablonunda, yakalayan alt şablon özgün olarak harf büyüklüğüne duyarlı eşleştiği halde bile "rah rah" ve "RAH RAH" ile eşleşecek ama "RAH rah" ile eşleşmeyecektir.

Aynı alt şablon için birden fazla geriye gönderim olabilir. Bir şablonun eşleşeceği bir dizge parçası yoksa onunla ilgili geriye gönderimler daima başarısız olacaktır. Örneğin, (a|(bc))\2 şablonu "bc" yerine "a" ile başlayan bir dizgeyle başarısız olacaktır. 99 ayrı geriye gönderim olabileceğinden bir tersbölüyü takibeden tüm rakamlar olası bir geriye gönderim olarak ele alınacaktır. Eğer alt şablon bir rakam karakteri ile devam ediyorsa geri gönderimi sonlandırmak için bir ayraç karakteri gerekir. PCRE_EXTENDED seçeneği etkinse bu ayraç karakteri, boşluk karakteridir. Aksi takdirde boş bir açıklama kullanmak gerekir.

Yaylı ayraçların içinde kullanılan bir geriye gönderim, ilgili alt şablonun hemen ardından kullanılmışsa başarısız olacaktır. Bu bakımdan, örneğin (a\1) şablonu hiçbir dizgeyle eşleşmeyecektir. Bununla birlikte, böyle alt şablon içindeki geriye gönderimler bazı durumlarda oldukça kullanışlı olabilir. Örneğin, (a|b\1)+ şablonu herhangi bir sayıda "a" veya "aba" ya da "ababba" ve benzeri dizgesiyle eşleşecektir. Alt şablonun her yinelenişinde, geriye gönderim kendisiyle ilişkili alt dizge ile eşleşecektir. Bunun çalışması için, ilk yinelemenin geriye gönderimle eşleşmesi gerekli değildir. Bu, yukarıdaki gibi olasılık belirtimiyle veya asgarisi sıfır olan bir yineleyici kullanılarak yapılabilir.

İsimli alt şablonlarla ilgili geriye gönderimler (?P=isim) veya PHP 5.2.4 sürümünden beri ayrıca, \k<isim>, \k'isim', \k{isim} veya \g{isim} biçeminde olabilmektedir.

add a note add a note

User Contributed Notes 1 note

up
6
mnvx at yandex dot ru
1 year ago
Something similar opportunity is DEFINE.

Example:
    (?(DEFINE)(?<myname>\bvery\b))(?&myname)\p{Pd}(?&myname).

Expression above will match "very-very" from next sentence:
    Define is very-very handy sometimes.
              ^-------^

How it works. (?(DEFINE)(?<myname>\bvery\b)) - this block defines "myname" equal to "\bvery\b". So, this block "(?&myname)\p{Pd}(?&myname)" equvivalent to "\bvery\b\p{Pd}\bvery\b".
To Top