PHP De Karakter Grupları
Karakter Grupları
PHP`nin Düzenli İfadeleri`nde kolaylık sağlayan ve mesela
ziyaretçinin bir Form`da bir INPUT etiketine verdiği
yanıtıların içinde olmaması veya olmaması gereken karakterleri
bulmamıza imkan veren karakter grupları oluşturma yöntemini de
kullanabiliriz. Sözgelimi bütün sesli hafleri aratmak için
şöyle bir karakter grubu oluşturabiliriz:
[OoUuÖöAaOoEeıIiİ]
Karakter gruplarını köşeli parantez içinde yazarız. Bu
deyimle, PHP, içinde herhangi bir sesli harf bulunan bütün
değerleri eşleştirecektir. Bu yöntemden yararlanarak, şu
grupları kullanabiliriz:
[a-z] Herhangi bir küçük harfi bulur.
[A-Z] Herhangi bir büyük harfi bulur.
[a-zA-Z] Herhangi bir büyük veya büyük harfi bulur.
[0-9] Herhangi bir rakamı bulur.
[0-9.-] Herhangi bir rakamı, noktayı veya kesme çizgisini
bulur.
[ frtn] Herhangi bir Form-feed (kağıt çıkart), Newline (yeni
satır), Return (satırbaşı) karakterini veya boşluğu (space)
bulur.
Sözgelimi, bir alfanümerik değer kümesinde b3, u2, n9 gibi
birincisi küçük harf, ikincisi rakam olan iki karakterlik
dizileri bulmak istiyorsak, arama grubunu şöyle kurarız:
^[a-z][0-9]$
Bu deyim PHP`ye, a`da z`ye küçük harfle başlayan, (^işareti
aranan unsurun değerin başında olması gerektiğini söylüyor) ve
sonunda 0`dan 9`a bir rakam bulunan kelimeleri bulmasını
söyleyecektir. PHP, bu kelimenin sadece iki harfli olmasına
dikkat edecektir; çünkü grubumuzun bir başı ve bir de sonu
belirlendiğine göre, üç karakterli değerlerin bulunması imkanı
yoktur.
^işareti köşeli parantez içinde grup deyimi oluştururken
kullanılırsa, bu olumsuzluk anlamı taşır. Sözgelimi, iki
rakamlı ancak birinci karakteri rakam olmayan fakat ikinci
karakteri rakam olan değerlerin bulunması için şu deyim
gerekir:
^[^0-9][0-9]$
Burada en baştaki ^işareti "başında" demektir; ancak hemen
arkasından gelen grupta "rakam olmayan" demiş oluyoruz; ikinci
grup ve sonundaki $ işareti ile "rakamla biten" anlamına
geliyor. Deyimde sadece baş ve sonu gösteren iki eşleştirme
unsuru bulunduğuna göre bu deyim, "başında rakam olmayan,
sonunda rakam olan iki karakterli değerleri" bulmaya
yarayacaktır. Bu deyim söz gelimi 13`ü bulmayacak, fakat u2`yi
bulacaktır. Bu yöntemle şu grupları yapabiliriz:
[^a-z] Küçük harf olmayan herhangi bir harfi bulur.
[^A-Z] Büyük harf olmayan herhangi bir harfi bulur.
[^/^] , / veya ^ dışında herhangi bir karakteri bulur.
[^"`] Çift ve tek tırnak dışında herhangi bir karakteri bulur.
Grup oluşturmada kullandığımız özel karakterler de vardır.
Örneğin nokta işareti (.), yeni satır başlangıcı olmayan
herhangi bir karakter anlamına gelir. Dolayısıyla,
^.0$
deyimi yeni satırla başlamayan ve sıfır ile biten herhangi iki
karakterli değeri bulacaktır.
PHP`nin kullanılmaya hazır özel Düzenli İfade eşleştirme
grupları da vardır:
[[:alpha:]] Herhangi bir harf
[[:digit:]] Herhangi bir rakam
[[:alnum:]] Herhangi bir harf veya rakam
[[:space:]] Herhangi bir boş karakter
[[:upper:]] Herhangi bir büyük harf
[[:lower:]] Herhangi bir küçük harf
[[:punc:]] Herhangi bir noktalama işareti
[[:xdigit:]] Herhangi bir Hexadecimal karakter. [0-9a-fA-F]
Karakter eşleştirmede tekrar sayısı da bir özellik olarak
kullanılabilir. Tekrar sayısı belirtmek için süslü parantez
({}) kullanırız. Örnekler:
^a{4}$ İçinde sadece dört adet küçük a harfi bulunan
kelimeleri seç: aaaa.
^a{2,4}$ İçinde sadece iki üç veya dört adet küçük a harfi
bulunan kelimeleri seç: aa, aaa, aaaa gibi
^a{2, } İki veya daha fazla küçük a harfi bulunan kelimeleri
seç: haar, haaar, haaaar gibi. Bu deyim "har" kelimesini
seçmez.
t{2} Ardarda iki sekme işaretini bul
.{2} Herhangi çift karakteri bul: aa, &&, == gibi
^-{0,1}[0-9]{1,}$ Negatif veya pozitif herhangi bir tam sayıyı
bul
^[0-9]{1,}$ Pozitif herhangi bir tam sayıyı bul
Bu tür deyim oluşturma işlemleri giderek karmaşıklaşabilir.
Örneğin:
^-{0,1}[0-9]{0, }.{0,1}[0-9]{0, }$
Bu karmaşık deyim aslında sadece "Negatif veya pozitif bir
ondalık (double) değeri bul," anlamına geliyor. Kısaca
irdelersek, aranan degerin sıfır veya bir kere tekrarlanan bir
kesme çizgisiyle başlayabileceğini ("Sıfır veya bir kere"
demek, olsa da olur, olmasa da anlamına geliyor!) bunu sıfır
veya daha fazla kere tekrarlanan bir rakamın izleyebileceğini,
onu da sıfır veya bir kere tekrarlanan bir nokta işareti ile
sonunda sıfır veya daha fazla kere tekrarlanan herhangi bir
rakamın izleyebileceğini söylemiş oluyoruz.
PHP bu tür karmaşık ifadelerin hatasız yazılmasını sağlayan
kısayollara sahiptir. Bunları sıralayalım:
? {0,1} anlamına gelir. Kendisinden önce yer alan unsurun en
az sıfır en çok bir kere tekrar edilmesi gerektiğini
(olmayabileceğini ama olursa en fazla bir kere olabileceğini)
belirtir.
* {0, } anlamına gelir. Kendisinden önce yer alan unsurun
sıfır veya daha fazla kere tekrar edilmesi gerektiğini
(tümüyle opsiyonel olduğunu) belirtir.
+ {1, } anlamına gelir. Kendisinden önce yer alan unsurun en
az bir veya daha çok kere tekrar edilmesi gerektiğini
(bulunmasının zorunlu olduğunu) belirtir.
Bu kısa-yolları kullanarak, yukarıdaki karmaşık ifadeleri
basitleştirelim:
^[a-zA-Z0-9_]+Ş En az bir harf veya rakam veya
altçizgi içeren herhangi bir kelime
^[0-9]+Ş Herhangi bir pozitif tamsayı
^-?[0-9]+Ş Herhangi bir tamsayı
^-?[0-9]*.[0-9*$]+Ş Herhangi bir kesinli (double) sayı
Bir Düzenli İfade`nin yazılışında birden fazla arama-sıralanış
deyimine yer verebiliriz. Bunu yapmamızı sağlayan |
işaretidir. Örneğin,
.com|.co.uk
ifadesi ile, ya ".com" ya da ".co.uk" değerlerinin bulunmasını
sağlayabiliriz. Burada | işareti "veya" kelimesi gibi
düşünebilirsiniz.
Düzenli ifadeler yoluyla INPUT etiketinden gelen değerleri
incelerken hata yapmak kolaydır. Bunun için kendi
ifadelerinizi mutlaka sçeşitli olasılıklara karşı
sınamalısınız. Bu bölümün başında örnek olarak verdiğimiz
Düzenli İfade`yi hatırlıyor musunuz?
^.+@.+..+$
Örneğin bu ifade, ziyaretçinin elektronik posta adresini
yazması gereken bir INPUT etiketinin sağladığı değerin
gerçekten elektronik adres biçimi taşıyıp taşımadığını sınar.
Baştaki ^ ve nokta işaretleri ile artı işareti değerin önünde
boşluk olmamasını sağlıyor; @ işareti ise değerin içinde @
bulunması gerektiğine işaret ediyor. Tekrar eden nokta ve artı
işaretleri "ne kadar olursa olsun ve ne olursa olsun" anlamına
geliyor. Bunu izleyen nokta karakterini gösteren (.) işaret
buralarda bir de gerçekten nokta olması gerektiğini ve bunu
izleyen nokta ve artı tekrar "ne olursa olsun, ne kadar olursa
olsun" anlamını taşıyor. Başka bir deyişle, aradığımız değerin
"herhangi bir şey" @ "herhangi bir şey daha" . "birşeyler
daha" şeklinde olduğunu belirtmiş oluyoruz. Ne var ki
deyimiçinde iki nokta veya iki @ işareti olan veya @ işareti
ile nokta arasında bir şey bulunmayan veya @ veya noktadan
öncesi ya da sonrası boş olan bütün değerleri safdışı etmeye
yetmeyecektir. Sözgelimi bir ziyaretçimiz "@@@@.@@@" yazarsa,
bu deyim bu değeri geçerli bir elektronik adres sayacaktır.
PHP programlarımızda ziyaretçilerimizin verdiği değerleri
çeşitli bakımlardan sınamak ve seçmek mümkündür; ancak hiç bir
zaman yazılanların doğruluğunu garanti edemeyiz. Fakat
özellikle bir metinde bulunmaması gereken işaretlleri PHP`ye
aratabiliriz. Bunu Düzenli İfade Fonksiyonları sağlar.
|