| METİN DÜZENLEME VE DÜZENLİ İFADELER |  |  | |
Web programlarımızda bir ziyaretçinin bize
ulaştırdığı Form bilgilerini ve bir veritabanı dosyasından aldığımız ham
verileri yeniden düzenlememiz gerekir. PHP bunu yapabilmek için bize 50'den
fazla fonksiyon sağlar. Bunlardan sık kullanmamız gerekenleri ele alacağız. Daha
sonra, özellikle Unix işletim sistemine, Perl veya Javascript diline aşina
olanların hatırlayacağı Düzenli İfadedeler denen metin ve sıralanış (pattern)
eşleştirme araçlarının üzerinde duracağız. Bu iki araçla, elimize aldığımız
berhangi metne istediğimiz biçimi vermek veya metnin içinden istediğimiz bölümü
hemen hemen tamamen seçip biçimlendirmek ve kullanmak mümkün olur.
Temel alfanümerik fonksiyonları
PHP'nin metin olarak gördüğü değişkenlere
alfanümerik (String) türü değişkenler adını vermiştik. PHP'nin alfanümerik
fonksiyonları, bu tür değişkenlerin değerlerinin içinden bir bölümü alma, atma
veya değiştirme imkanı sağlar. Programlarımızda sık kullanacağımız bir kaç
fonksiyonu ele alalım.
substr() :
Bir alfanümerik değişkenin değerinin veya bir
metnin tanımladığınız bölümünü verir. İkisi zorunlu, biri seçmeli üç parametre
ile kullanılır. Yazılışı:
substr($degisken, başla, [boyut] );
Burada, $degisken yerine içinden bir bölümü seçmek
istediğiniz metni tutan değişkenin adını; başla yerine seçme işleminin
başlayacağı karakterin baştan itibaren kaçıncıdan sonra olduğunu ve isterseniz
boyut yerine de seçilmesini istediğimiz karakter sayısını yazarız. Kaç karakter
seçileceğini gösteren boyut parametresini yazmazsanız, PHP değişkenin veya
metnin sonuna kadar seçer. Örnek :
$secilen = substr ("abcdef", 1); Burada $secilen değişkeninin değeri "bcdef"
olacaktır; çünkü birinci karakterden sonra seçime başlatıyoruz ve seçimin
boyutunu belirlemiyoruz. PHP, verdiğimiz metnin sonuna kadar seçecektir.
$degisken = "Olumsuz düşünce ve mekanizmalar üzerine olumlu şeyler bina edilemez!";
$secilen = substr ($degisken, 8, 20);
Burada ise seçime 8'nci karakterden sonra
başladığımız ve 20 karakterlik seçim yapılmasını belirttiğimiz için seçilen
değer "düşünce ve mekanizma" olacaktır. Başlanıç olarak verdiğiniz sayı negatif ise
(önünde - işareti varsa) seçim işlemine değişkenin sonundan itibaren başlanır.
Yukarıdaki substr() fonksiyonunu:
$secilen = substr($degisken, -9);
şeklinde yazarsak, dönen değer, "edilemez!"
olacaktır.
trim() : Bir alfanümerik değişkenin değerinin baş ve son
tarafındaki boşlukları atar. Yazılışı:
trim($degisken);
Bu fonksiyon değişken değerinin veya metnin
başındaki ve sonundaki "\n", "\r", "\t", "\v", "\0", ve aralık işaretini boşluk
sayar. Örnek:
$degisken = "\0 Olumsuz düşünce ve mekanizmalar üzerine olumlu şeyler bina edilemez!\n\r\t";
$secilen = trim ($degisken);
Burada seçilen metinde, baştaki boşluk, sondaki
yeni satır, satır başı ve sekme karakterleri olmayacaktır.
chr() :
Parametre olarak ASCII değerini belirttiğimiz
karakteri sağlar. Örnek:
echo (chr(34);
Bu komutla Browser penceresinde çift-tırnak
işareti görüntülenir.ord() : Parametre olarak yazdığınız karakterin ASCII
değerini sağlar. Örnek:
echo (ord("A"); Bu komutla Browser penceresinde 65 rakamı
görüntülenir. bu fonksiyonun başlıca kullanım alanı, bir değişkenin değerini
arzu ettiğimiz bir karakterin ACSII koduyla karşılaştırmak olabilir. Örneğin:
if ( ord($karakter) == 60)
{ // karakter "<" işareti ise
$karakter = "" ;
} koduyla, bir Form'dan gelen verileri
karakter-karakter sınayabilir ve içinde normal olarak bulunmaması gereken,
zararlı kod parçası olması ihtimali bulunan karakterleri ayıklatabiliriz.strlen() : Bir alfanümerik değişkenin değerinin kaç karakter
içerdiğini bildirir. Yazılışı:
strlen($degisken);
Bu fonksiyondan dönen değer tam sayıdır; aritmetik
işlemlerde kullanılabilir. Örneğin, ziyaretçinin bir INPUT alanına yazdığı
yazının uzunluğunun arzu ettiğimiz ölçülere uygun olup olmadığını sınamakta bu
fonksiyondan yararlanabiliriz:
if ( strlen($degisken) > 30 )
{ // girilen değer 30 karakterden uzun ise
echo ("Lütfen 30 karakterden uzun yazmayınız!);
}printf() ve sprintf() : Bu fonksiyonları bir değişkeni biçimlendirmekte
kullanırız. Birincisinin elde ettiği sonuç ziyaretçinin Browser penceresine
gönderilir; ikincisin elde ettiği sonuç ise değer olarak döner. Önce bu
fonksiyonlarla kullanabileceğimiz biçim parametrelerini sıralayalım:
| % |
Yüzde işareti. Yanında biçim parametresi gerekmez. |
| b |
Değişken tamsayı olarak işlem görür ve ikili sayı olarak döner. |
| c |
Değişken tamsayı olarak işlem görür ve ASCII değerinin karşılığı olan karakter olarak döner. |
| d |
Değişken tamsayı olarak işlem görür ve ondalık sayı olarak döner. |
| f |
Değişken kesirli sayı olarak işlem görür ve kesirli sayı olarak döner. |
| o |
Değişken tamsayı olarak işlem görür ve sekiz-tabanlı (octal) sayı olarak döner. |
| s |
Değişken alfanümerik olarak işlem görür ve alfanümerik olarak döner. |
| x |
Değişken tamsayı olarak işlem görür ve 16 tabanlı (hexadecimal) sayı olarak döner. (Harfler, küçük harf olur). |
| X |
Değişken tamsayı olarak işlem görür ve 16 tabanlı (hexadecimal) sayı olarak döner. (Harfler, büyük harf olur). |
Her iki fonksiyonun da kullanılış biçimi aynıdır:
printf( "biçim" , $degisken1, $degisken2, ... "metin" );
Burada "biçim" yerine yukarıdaki biçim
parametlerini yazarız. Biçim parametrelerinin önüne yüzde işareti konur; en
fazla beş belirleyici özellik alabilir. Yukarıdaki tür belirten biçimlendirme
parametlerine ek olarak diğer özellikler şöyle sıralanır:
- Doldurma karakteri : tek tırnak ve onu izleyen bir
karakterden oluşur.
- Hizalama : Eksi işaretinin varalığı yazının sola,
yokluğu ise sağa hizalanma anlamına gelir.
- En az-en çok uzunluk : Sayı-nokta-sayı (örneğin
40.40 gibi) yazılır; birinci sayı azamî, ikinci sayı asgarî uzunluğu belirtir.
Bu üç özelliğe bir örnek verelim.Bir değişkenin
değerinin sonuna yanyana yeteri kadar nokta konarak uzunluğunun 40 karaktere
çıkartılmasını şu deyimle sağlarız:
$degisken = " İyilik üzerine " ;
printf( "%'.-40.40s" , $degisken);
Burada "%'.-40.40s" şeklindeki biçim komutu,
Browser penceresinde şu görüntüyü oluşturur:
"İyilik üzerine.........................."
Burada "İyilik üzerine" değeri 14 karakter olduğu
için, sonuna 26 adet nokta eklenmiş ve bütün değer sola hizalanmış olacaktır.
Şu komut ise iki değişkenin değerini ve vereceğimiz bir metni aynı satıra
yazdıracaktır:
$degisken1 = " İyilik üzerine " ;
$degisken2 = " İyilik üzerine " ;
$metin = "<br>\n" ;
printf("%'.-40.40s%'.2d%s",$degisken1,$degisken2,$metin); Bu komut Browser penceresinde şu görüntüyü
oluşturur:
"İyilik üzerine..........................86"
Burada eklediğimiz ikinci "%'.2d" şeklineki
biçim komutu ile, ikinci değişkenin değeri, en az sıfır en çok iki adet nokta
ile doldurulmak ve sağa hizalanarak ondalık sayı olarak görüntülenmek üzere
biçimlendiriliyor. Üçüncü biçim komutu olan "%s" ise üçüncü değişkenin sadece
alfanümerik olarak muamele görmesini sağlıyor. Biçim komutlarının arasında
boşluk bulunmaması, ait oldukları değişken değerlerinin de aralarına boşluk
konmamasına sebep oluyor. Üçüncü değişkenin etkisini, kağıt üzerinde
göremiyoruz; ancak bu Browser penceresinde bundan sonra gelecek unsurların bir
satır aşağı kaymasını sağlayacaktır.Dördüncü biçim özelliği, ondalık sayıların
virgülden (veya noktadan) sonra ondalık bölümünün kaç hane olacağını belirler.
Bunu da bir örnekle görelim:
$degisken = " 124 " ;
printf( "Değeri (ABD) $%.2f" , $degisken);
Bu biçimlendirme komutu da Browser penceresine şu
yazıyı yazdırır:
Değeri (ABD) $124.00
number_format() : Türü sayı olan değişken değerlerini
bin-basamakları şeklinde biçimlendirmekte kullanılır. Parametre olarak sayı
içeren değişkenin adını, ondalık bölümün kaç haneli olacağını, ondalık hanesini
ve binler basamaklarını ayırmakta kullanılacak karakteri kabul eder. Örnek:
$degisken = 1234567890.1234567890 ;
echo (number_format($degisken, 4 chr(44) ,"."));
Bu deyimle 1234567890.1234567890 şeklindeki değer,
Browser penceresine "1.234.567.890,1235" şeklinde yazdırılacaktır.
Tarih ve saat düzenleme
PHP'nin tarih ve zaman bilgisini kullanmamızı
sağlayan getdate() fonksiyonunun yanı sıra, elde ettiğimiz bilgileri çok daha
esnek biçimlendirmemizi sağlayan date() fonksiyonu da sık kullanılır. Bu
fonksiyon çağrıldığı yerde bize Unix sisteminin Epoch zaman-tarih damgasını
verir. Bu verinin biçimlendirilmesi için çeşitli parametreler vardır. Bu
parametreler, gün adlarının dili ve tarihlerin yazılışı bakımından Web
sunucusunun bulunduğu bilgisayardaki bölgesel ayarlara göre sonuç verir.
date() $tarih date( biçimlendirme_parametreleri );Burada biçimlendirme_parametleri yerine şunları
yazabilirsiniz:
| a |
12 saat esasına dayanan Anglo-Sakson sistemlerinde
öğleden önce ("am") veya öğleden sonra ("pm") işaretinin verilmesini sağlar. |
| A |
Aynı işaretlerin büyük harfle yazılmasını sağlar. |
| d |
İki haneli gün sayısı, tek haneli günlerin önüne sıfıır konur: "01" - "31" |
| D |
Üç haneli gün adı kısatması: "Cum" |
| F |
Uzun ay adı: "Ocak" |
| h |
12 saatlik sistemde saat: "01" - "12" |
| H |
24 saatlik sistemde saat: "00" - "23" |
| g |
12 saatlik sistemde tek haneli saatlerin önüne sıfır konmadan saat: "1" - "12" |
| G |
24 saatlik sistemde tek haneli saatlerin önüne sıfır konmadan saat: "0" - "23" |
| i |
Dakika: "00" - "59" |
| j |
Tek haneli sayıların önüne sıfır konmadan gün sayısı "1" - "31" |
| l |
(küçük L harfi) Uzun gün adı: "Cuma" |
| L |
Artık yıl olup olmadığına ilişkin Boolean (doğru/yanlış) değişken. Artık yıl ise 1, değilse 0. |
| m |
Tek hanelilerin önüne sıfır konarak ay sayısı: "01" - "12" |
| n |
Tek hanelilerin önüne sıfır konmadan ay sayısı: "1" - "12" |
| M |
Kısaltılmış ay adı: "Şub" |
| s |
Saniye: "00" - "59" |
| S |
İngilizce ('ncı anlamına) 2 karakter ek: "th", "nd" |
| t |
Belirtilen ayın gün sayısı; "28" - "31" |
| w |
Haftanın gün sayısı: "0" (Pazar veya Pazartesi) - "6" (Cumartesi veya Pazar) |
| Y |
Dört haneli yıl: "2000" |
| y |
İki haneli yıl "00" |
| z |
Yılın gün sayısı: "0" - "365" |
Örnek:
print (date ("l dS of F Y h:i:s A")); Browser penceresine İngilizce bölgesel ayarlar
yapılmış bir bilgisayara kurulu Web sunucusunda: "Sunday 30th of July 2000
07:51:08 AM" yazdırır.
print (date ("l, d F Y g:i:s"));Browser penceresine Türkçe bölgesel ayarlar
yapılmış bir bilgisayara kurulu Web sunucusunda: "Pazar, 30 Temmuz 2000
07:51:08" yazdırır. date() ve mktime() fonksiyonlarını birlikte
kullanarak geçmiş veya gelecek tarihleri bulma imkanı de vardır. Örnek:
$yarin = mktime (0,0,0,date("m") ,date("d")+1,date("Y"));
$gecen_ay = mktime (0,0,0,date("m")-1,date("d"), date("Y"));
$gelecek_lyl = mktime (0,0,0,date("m"), date("d"), date("Y")+1);
Düzenli İfadeler
Unix işletim sistemini geliştirenlerin bilişim
teknolojisine kazandırdığı bir diğer değer biçilemez araç olan Düzenli İfadeler
(Regular Expressions), belki de işaretlerinin karmaşıklığı sebebiyle
programcıların fazla dokunmak istemedikleri bir alandır. Bu kavramla daha önce
tanışmış olmayanlara, CGI veya Javascript kodlarında gördükleri,
^.+@.+\\..+$
işaretlerinin, Düzenli İfade işlemlerine ait
olduğunu belirtilim. Bu işaretler ve onların arasına koyduğumuz karakter
örnekleri ile, PHP'nin aradığımız bir metnin karakterlerinin hangi diziliş,
sıralanış konumunda olduğuna bakarak, bize o metni bulmasını sağlarız; ya bu
metni kullanırız, sileriz veya değiştiririz. Dolayısıyla, Düzenli İfade demek,
bir diziliş, sıralanış biçimi demektir. Düzenli İfade oluşturarak, PHP'ye "İşte
buradaki gibi sıralanmış karakterleri bul!" demiş oluruz. Düzenli İfade, PHP'ye
verdiğimiz sıralanışa uygun metnin nerede ve kaçıncı kez bulunmasını
istediğimizi de belirtir. Ayrıca, bu ifade ile, PHP'nin bulduğu metni (veya
metinleri) ne yapmasını istediğimizi de söyleriz.
Eşleştirme deyimleri ve işaretler
PHP'nin karakter ve sıralanış eşlemede kullanılan
düzenli ifade komutlarını kısaca ele alalım; sonra bunları kullanmamıza imkan
veren fonksiyonları görelim.
^hakk
"hakk" ile başlayan bütün kelimeleri bulur.
^işareti, onu izleyen karakterin sadece alfanümerik değişkenin başında olması
gerektiğine işaret eder. Bu deyimle, "Hakkı Öcal bugün buradaydı!" veya
"Hakkıdır hakka tapan, milletimin istiklâl!" eşleşebilir; fakat "Anaların hakkı
ödenmez!" eşleşmez; çünkü PHP açısından ^işaretinin anlamı, "Başlangıcında
'hakk' karakterlerinin sıralanıyla aynı sıralanıştaki alfanümerik değeri bul!"
demektir.
edilemez$
Bu deyim ise PHP'ye "edilemez" ile biten bütün
kelimeleri bulur. Sözgelimi, "Kötümser insanın yükselişinden bahsedilemez"
cümlesi bu deyimle bulunabilir; fakat sonunda nokta olduğu için ".. edilemez."
diye biten hiç bir cümle bu deyimle eşleşemez.
^hakkı$
PHP, başında ^ işareti, sonunda $ işareti bulunan
kararter sıralanışını, aynen arar; yani bu deyim, birinci örnekteki üç cümleyi
de bulamaz.
hakk
Bu deyim ise her üç cümleyi de buldurur; çünkü
üçünde de bu dört karakter bu sıralanışla mevcuttur. PHP'nin Düzenli İfadeleri,
bütün rakam ve harfleri eşleştirebilir. Fakat sorun, özel karakterlerde çıkar.
Sözgelimi, sekme işareti, satır sonlarında yeni-satır/satırbaşı işareti, gibi
özel karakterleri, ancak önlerine Escape işareti olan ters bölü işaretini
koyarak buluruz.Düzenli İfadelerde Özel Karakterler
| [\b] |
Geri (Backspace) karakterini bulur. |
| \b |
Belirtilen karakterle sınırlanan kelimeyi bulur: k\b, "hak mücadelesi" ifadesindeki birinci k'yı bulur; çünkü bu harf, bir kelime sınırlayıcıdır. |
| \B |
Belirtilen karakterle sınırlanmayan kelime yoksa, başlayanı bulur: k\Bi, "üç kişi" ifadesindeki 'ki'yi bulur. |
| \cX |
X yerine yazacağımız kontrol karakterini bulur. Örneğin, \cA, Ctrl+A'yı, \cZ ise Ctrl+Z'yi bulur. |
|
|
| \d |
0'dan 9'ya kadar bir rakamı bulur: IE\d, her ikisi de herhangi bir rakamla biten "IE5" ve "IE4" değerlerini ikisini de bulur, |
| \D |
Herhangi bir ondalık işaretini bulur. |
| \f |
Form-feed (kağıt çıkart) karakterini bulur. |
| \n |
Newline (yeni satır) karakterini bulur. |
| \r |
Return (satırbaşı) karakterini bulur. |
| \s |
Boşluk (space) bulur. |
| \S |
Yatay ve düşey sekme, kağıt-çıkart, yeni satır, satırbaşı ve boşluk dışındaki herhangi bir karakteri bulur. |
| \t |
Yatay sekme (Tab) karakterini bulur. |
| \v |
Düşey sekme karakterini bulur. |
| \w |
Herhangi bir harf, rakam veya alt-çizgiyi bulur. |
| \W |
Harf, rakam ve alt-çizgi dışındaki karakteri bulur. |
| \xHex |
Verilen 16 tabanlı (Hexadecimal) sayıya uygun Escape karakterini bulur. Örneğin, \n25, % işaretini bulur. |
Bu arada noktalama işaretlerini arattırırken,
önlerine ters bölü işareti koymak gerekir. Ters bömü işaretini de yine önüne
ters bölü işareti koyarak (\\) arttırabilirsiniz.
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. |
| [ \f\r\t\n] |
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.
^.+@.+\\..+$
Ö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.
Düzenli ifade fonksiyonları
Yukarıda öğrendiğimiz Düzenli İfade yazma
tekniklerini, PHP'nin bize sağladığı beş fonksiyonda parametre olarak
kullanırız. PHP'nin ayrıca Perl-tarzı düzenli ifade fonksiyonları da vardır. Bu
fonksiyonlardan, ya bize bir boolean (doğru/yanlış) değer döner; ya da fonksiyon
istediğimiz işi yaparak vardığı sonuçları verdiğimiz değişkene yazar. Biz, daha
sonra bu değere bakarak veya değişkenin değerlerini kullanarak, PHP
programımızın akışını kontrol edebiliriz. Burada ele alacağımız fonksiyonlara
ilişkin örneklerde, daha önceki bölümlerde oluşturduğumuz konuk defteri programı
ile Web ziyaretçilerimizin sunucuya göndereceği bilgileri doğrulamaya ve
muhtemel zararlı kodlardan ayıklamaya çalışacağız.
ereg() ve eregi() : PHP'nin temel Düzenli İfade Fonksiyonu, ereg(),
arattığımız karakter sıralanışı bulunduğu taktirde doğru, bulamadığı taktirde
yanlış karşılığı bir değer verir. Fonksiyonu şöyle yazarız:
$bir_degisken = ereg("eşleştirilecek_sıra",$kaynak,$yeni_değişken); Fonksiyonun aradığımız eşleştirmeyi yapması
halinde, buradaki $bir_degisken'in değeri true/doğru, yapamaması halinde
false/yanlış olacaktır. Eşleştirme sırasının nasıl oluşturulduğunu yukarıda
gördük; bu ifadelerden işimize uygun olanı buraya tırnak içinde yazarız.
$kaynak, eşleştirilecek sıralamanın içinde aranacağı değeri tutan değişkendir.
Fonksiyonun bir diğer becerisi, eğer eşleştirilecek sıralamayı gruplar halinde
verirsek, kaynakta yapacağı eşleştirme olursa, buna uygun değerleri bir dizi
değişkene yazabilmesidir; istersek bir parametre olarak bu yeni değişkenin
almasını istediğimiz adı veririz; böylece eşleştirme sonucu bulunan değerler
kaydedilmiş olur.eregi(), aynen ereg() fonksiyonu gibi çalışır; sadece
eşleştireceği değerlerde büyük-harf/küçük-harf farkı gözetmez. Daha önceki bölümde oluşturduğumuz ve kd_01.php
adıyla kaydettiğimiz konuk defteri programının akış planını, ziyaretçinin Form'a
yazdığı ve sunucuda $HTTP_POST_VARS dizi-değişkeninde tutulan değişkenlerinden
elektronik posta adresi ilge ilgili olanı gerçekten içinde en az bir @ işareti
ile en az bir adet nokta içip içermediğine bakarak sınayabiliriz. Böyle bir
sınama için gerekli kod şöyle olabilir:
if (eregi("^.+@.+\\..+$", $adres, $email))
{
//Hiç bir şey yapma
}
else
{
$hata = "Elektronik posta adresinizde bir hata var!<br>";
echo $hata;
include("kd_hata_halinde.htm");
exit;
} Program, bu örnekte $adres değişkeninde kayıtlı
değerin içinde aradığı sıralamayı bulursa, eşleşen değeri $email adlı yeni bir
değişkene yazacak ve if sınavının sonucu doğru olacaktır. Bu sıralamaya uygun
bir değer bulunamazsa, if sınavı else deyimine atlayacak ve bir hata mesajı
üretilerek, bu program durdurulacaktır. (Burada, yaptığı hayatı düzeltmesi yani
geçerli bir elektronik posta adresi vermesini sağlayan yeni sayfanın, include
komutu ile ziyaretçiye gönderildiğine dikkat edin.)ereg_replace() ve eregi_replace() : Gördüğümüz gibi, ereg() arattığımız karakter
sıralanışı bulunduğu taktirde doğru, bulamadığı taktirde yanlış karşılığı
verdikten sonraduruyor! Oysa kimi zaman arattığımız ve bulunan değerin başka bir
değierle değiştirilmesi gerekebilir. Bunun için ereg_replace() ve
eregi_replace() fonksiyonlarını kullanırıız:
ereg_replace("eşleştirilecek_sıra",yeni_metin,$kaynak); Fonksiyonun aradığımız eşleştirmeyi bulursa, bu
değerin yerine verdiğimiz yeni metni koyacaktır; yeni metni bir değişkenin
değeri olarak da verebiliriz. Uygulama örneği için yine konuk defteri örneğine
dönelim. Ziyaretçilerimiz kimi zaman yanlışlıkla, kimi zaman pek de iyi niyet
sonucu olmadan, kendilerinden beklediğimiz isim, adres ve mesaj yerine sunucu
veya başka ziyaretçilerin Browser programları tarafından kod gibi algılanacak
metinler yazabilirler. PHP'de güvenlik bölümünde bu konuda daha ayrıntılı bilgi
bulacaksınız. Burada sadece bu tür zararlı metinlerin genellikle programlarda
bulunması gereken karakterler içerdiğini söylemekle yetinelim. Bu tür
karakterlerin başında < ve > işaretleri bulunur! Dolayısıyla, biz de
ziyaretçimizden gelecek verilerin yazıldığı değişkenlerin değerlerinde bu
işaretleri aratabilir ve bunları içi boş bir alfanümerik değer ile
değiştirebilir; yani silebilir. Zararlı olabilecek kodların arasında daha bir
çok karakter bulunabilir; ancak Script diliyle yazılması gereken bu kodlardan <
ve > işaretlerini kaldırılması kodları işlemez hale getireceği için, şu
aşağıdaki örnek yeterli olabilir:
$adi = ereg_replace("<","",$adi);
$adi = ereg_replace(">","",$adi);
$adres = ereg_replace("<","",$adres);
$adres = ereg_replace(">","",$adres);
$mesaj = ereg_replace("<","",$mesaj);
$mesaj = ereg_replace(">","",$mesaj); Burada ereg_replace() fonksiyonu, ziyaretçiden
gelecek üç değişkenin değerlerinde < ve > işaretlerini aramakta onların yerine
içi boş bir metin ("") yazmaktardır. split() : Düzenli İfade ile çalışan bu fonksiyon,
vereceğimiz eşleştirme sıralamasını sınırlayıcı olarak kullanarak,
belirteceğimiz değerde bulduğu değer parçalarını ayırır ve bunları ayrı ayrı bir
dizi değişkenin elemanları olarak kaydeder. Bu fonksiyonu şöyle yazarız:
$yeni_dizi_değişken = split("eşleştirilecek_sıra",$kaynak,sınır_sayısı); Fonksiyon, aradığı sıralamayı bulamazsa,
false/yanlış sonucunu verir. Burada sınır sayısı olarak vereceğimiz rakam,
oluşturulacak yeni dizi değişkene en fazla kaç eleman yazılmasını istediğimizi
gösterir. Bu sayıyı vermezsek, PHP yeni dizi değişkenin gerektiği kadar elemana
sahip olmasını sağlar. Bir örnek vererek, bu fonksiyonu nasıl
kullanibileceğimizi görelim:
<?php
$metin = "İnsan sözüyle kendini gösterir, davranışlarıyla ruh halini aksettirir.";
$aranan = " ";
$yeni_dizi_değişken = split($aranan, $metin);
foreach ($yeni_dizi_değişken as $eleman)
{
print "$eleman <br>";
}
?> Bu programda PHP, $metin değişkeninin içerdiği
değerde $aranan değişkeninin içerdiği değeri, yani boşluğu, eşleştirilecek unsur
olarak kullanacak ve $metin değişkeninin değerini boşluklarından parçalara
ayıracaktır. Ayrılıcak her yeni parça, $yeni_dizi_değişken adlı değişkenin
elemanları olarak atanacaktır. Programın geri kalan kısmı ise, bu yeni dizinin
elemanlarını görüntülemekterdir.sql_regcase() : İçinde büyük harf-küçük harf ayrımı olan bir
değeri büyük harf-küçük harf ayrımı olmayan Düzenli İfadeler haline çevirir. Bu
fonksiyon bizden Düzenli İfade almaz, tersine Düzenli İfade oluşturur. Örnek:
<?php
$metin = "Sözler";
echo(sql_regcase($metin);
?>
Bu program, Browser penceresine şu metni yazdırır:
[Ss][Öö][Zz][Ll][Ee][Rr]