CascadiaPHP 2024

Alt Şablonlar

Alt şablonlar yaylı ayraçlarla sınırlanır ve iç içe olabilirler. Bir şablonun bir alt parçası iki şekilde kendini gösterir:

  1. Bir olasılık kümesinden oluşabilir. Örneğin, gel(enek|incik|) şablonu "gel", "gelenek" ve "gelincik" sözcüklerinden biriyle eşleşecektir. Yaylı ayraçlar olmasaydı "gelenek", "incik" ve boş bir dizge ile eşleşirdi.

  2. Şablon grupları olarak görünebilir (aşağıya bakınız). Şablonun tamamı eşleştiğinde, eşleşmeye konu dizgenin alt şablonla eşleşen parçası pcre_exec() işlevinin ovector bağımsız değişkeni üzerinden çağrıcıya aktarılır. Yakalayan alt şablon sayısını tutturmak için grup açılışları soldan sağa doğru sayılır (ilk grup 1 olmak üzere).

Örneğin, "the red king" dizgesini the ((red|white) (king|queen)) şablonuyla eşleştirmek istersek "red king", "red" ve "king" dizgeleri 1, 2 ve 3 olarak numaralanacaktır.

Aslında, salt yaylı ayraçları kullanarak bu iki işlevi yerine getirmek her zaman yararlı olmaz. Çoğu zaman bir gruplama alt şablonu bir yakalama gereksinimi olmaksızın kullanılır. Eğer açan yaylı ayracı takiben bir "?:" dizilimi varsa bu alt şablon herhangi bir yakalama yapmaz ve ardından gelen diğer yakalayan alt şablonların sayısında hesaba katılmaz. Örneğin, "the white queen" dizgesini the ((?:red|white) (king|queen)) şablonu ile eşleştirmek istersek "white queen" ve "queen" alt dizgeleri 1 ve 2 olarak numaralanır. Yakalayan alt şablonların azami sayısı 65535'tir. Bununla birlikte, libpcre'nin yapılandırma seçeneklerine bağlı olarak bu kadar büyük şablonları derlemek mümkün olmayabilir.

Uygun bir kısaltma olarak, yakalamayan bir alt şablonun başlangıcında bir seçenek ayarı gerekliyse seçenek harfleri "?" ile ":" arasına konabilir. Dolayısıyla,

(?i:saturday|sunday)
(?:(?i)saturday|sunday)
  

şablonlarının ikisi de aynı dizgeyle eşleşecektir. Olasılıklar soldan sağa değerlendirildiğinden ve seçenekler alt şablonun sonuna ulaşılıncaya kadar sıfırlanmayacağından tek bir olasılık dahilindeki bir seçenek ayarı sonraki olasılıkları da etkileyecektir, dolayısıyla yukarıdaki şablonlar "Saturday" ve hatta "SUNDAY" ile de eşleşecektir.

Bir alt şablonu (?P<ad>kalıp) ile isimlendirmek mümkündür. Eşleşmeleri içeren dizi, numaralarına göre indislenmiş eşleşmelerin yanısıra dizgelerine göre indislenmiş eşleşmeleri de içerecektir. Buna eşdeğer iki sözdizimi daha vardır: (?<ad>kalıp) ve (?'ad'kalıp)

Bazen, düzenli bir ifadede birden çok eşleşen, ancak değişen alt grupların varlığı gerekir. Normalde, bunlardan yalnızca biri muhtemelen eşleşecek olsa bile, bunların her birine kendi geri başvuru numarası verilir. Bunun üstesinden gelmek için, (?| sözdizimi yinelenen sayılara izin verir. Sunday dizgesiyle eşleşen aşağıdaki normal ifade ele alınırsa:

(?:(Sat)ur|(Sun))day

Burada Sun, 2. geri başvuruda depolanırken, 1. geri başvuru boştur. Saturday eşleşmesi, 1. geri başvuruda Sat verir, 2. geri başvuru yoktur. (?| kullanmak için kalıbı değiştirmek bu sorunu giderir:

(?|(Sat)ur|(Sun))day

Bu kalıp kullanılarak, hem Sun hem de Sat 1. geri başvuruda saklanacaktır.

add a note

User Contributed Notes 1 note

up
-6
mike at eastghost dot com
9 years ago
(?:(?!string).)

?: makes a subpattern

?! is a negative look-ahead.

Putting negative look-ahead before the dot causes regex engine to first find any occurrence of the negative look-ahead string, and only then, if the negative look-ahead string is not present, should an arbitrary character (due to the dot) match.
To Top