PHP Dili
PHP yorumlayıcısı, bu
"programı" çalıştırabilmek için dosyanın içinde PHP komutlarını arar.
PHP komutları birinci bölümde gördüğümüz gibi iki şekilde yazılabilir:
1. <?PHP .... ?>
2. <? .... ?>
Bunlara PHP komut ayracı
denir; birinci türü uzun veya standart ayraç sayılır; ikincisine ike "kısa
ayraç" denir.
PHP kodlarımız,
oluşturulmasını istediğimiz sayfanın HTML kodları ile tabir yerinde ise içiçe
yazılır.
<?PHP
print
"Merhaba Dünya!";
?>
Sayfalara yorum eklemek için;
<HTML>
<!- - Bu satır HTML'in yorum satırı
Buraya istediğimiz kadar yorum yazabiliriz..
Browser bu satırları dikkate almaz - - >
<HEAD>
<TITLE>PHP ile Merhaba</TITLE>
</HEAD>
<BODY>
<CENTER>
<B>
<H1>
<?PHP
/*
Bu satır da PHP'nin çok-satırlı yorum bölümü..
Bunu da PHP yorumcusu asla dikkate almaz
Buraya istediğimiz kadar yorum yazabiliriz.
*/
print "Merhaba Dünya!";
// Bu ise PHP'nin tek satırlı yorum bölümü
# Bu satırları da PHP yorumcusu dikkate almayacaktır.
?>
</H1>
</B>
</CENTER>
</BODY>
</HTML>
Değişkenler
PHP'de de, bir çok başka
bilgisayar programlama dilinde olduğu gibi değişkenlerin içine bir değer
konmadan önce tanımlanması mümkündür; fakat gerekli değildir. Değişkenleri
adının önüne $ işareti koyarak tanımlarız:
$adi;
$soyadi;
$123;
$sevdigiRenk;
PHP'de genellikle değişkenleri
değerini atayarak belirleriz:
$adi = "Reşit";
$soyadi = "Gülen";
$123 = 123;
$sevdigiRenk = "yeşil";
Değişkenler, kullanıldıkları
işleme, taşıdıkları değeri verirler:
print $adi;
PHP'de özel bir değişkene
değişken adı olarak kullanılacak değerleri de atayabiliriz:
$adi = "Reşit";
$degisken = "adi";
print $$degisken;
Burada Browser penceresine
yine "Reşit" kelimesi yazılacaktır; çünkü PHP $degisken adlı
değişkenin "adi" adlı değişkeni tuttuğunu bilecek ve iki Dolar
işaretini görünce, $degisken'in değerini değil, onun tuttuğu değişkenin
değerini yazacaktır.
Veri Türleri
PHP açısından dünyada altı tür
değer vardır:
Tamsayı (Integer): 5,124,
9834 gibi
Çift (Double):
3,567 gibi
Alfanümerik (String): "Reşit"
gibi
Mantıksal (Boolean): doğru (true)/yanlış
(false) gibi
Nesne (Object)
Dizi (Array)
Tür Değiştirme
Bir değişkenin değerinin türü
hakkında kuşkunuz varsa, en emin yol bunu PHP'nin kendisine sormaktır. Bu
sorgulamayı gettype() fonksiyonu ile yaparız.
Şimdi, bir PHP programı
yazalım, bir takım değişkenlere değerler atayalım ve bunların türlerini PHP'ye
soralım.
$sayi = 5;
print("Birinci değişkenin adı: \$sayi<br>");
print("Değeri : ");
print "$sayi<br>";
print("Türü : ");
print gettype( $sayi ) ; //tamsayi/integer
print "<br>";
print "<br>";
$alfanumerik = "Reşit";
print "İkinci değişkenin adı: \$alfanumerik<br>";
print "Değeri : ";
print "$alfanumerik<br>";
print("Türü : ");
print gettype( $alfanumerik ) ; //alfanümerik/string
print "<br>";
print "<br>";
$ondalik = 5.1234;
print "Üçüncü değişkenin adı: \$ondalik<br>";
print "Değeri : ";
print "$ondalik<br>";
print("Türü : ");
print gettype( $ondalik ) ; //çift,ondalık/double
print "<br>";
print "<br>";
$mantiksal = true;
print "Üçüncü değişkenin adı: \$mantiksal<br>";
print "Değeri : ";
print "$mantiksal<br>";
print("Türü : ");
print gettype( $mantiksal ) ; //mantıksal/boolean
print "<br>";
print "<br>";
Burada mantıksal (boolean)
değer olarak doğru anlamına true değeri atadığımız halde, PHP'nin bu
değişkenin değeri olarak 1'i gösterdiğine dikkat edin. PHP'de bir fonksiyon,
elde ettiği değer doğru ise sonuç olarak 1 değerini verir. (Yanlış/false
değerinin neye çevrildiğini bulabilir misiniz?)
Escape
şu satırdaki, ters-bölü işareti
dikkatinizden kaçmamış olmalı:
print "İkinci değişkenin adı: \$alfanumerik<br>";
PHP için özel anlamı olan
işaretlerin anlamlandırılmasını önlemek ve bu işaretleri düz metin saymasını
sağlamak için bu işaretlerin önüne ters-bölü işareti koyarız.
şöyledir:
\' Tek tırnak
\" Çift
tırnak
\\ Ters-bölü
\$ Dolar
işareti
\n Yeni Satır
(New Line)
\r Satır Başı
(Return)
\t Sekme (Tab)
karakteri
Kimi zaman bir değişkene
atadığımız değerin türünü değiştirmek gerekir. Bunu settype() fonksiyonu ile
yaparız.
$degisken = 5.67890;
print("Değişkenin değeri : ");
print "$degisken<br>";
print("Türü : ");
print gettype( $degisken ) ; //çift,ondalık/double
print "<br>";
print "<br>";
print "İlk değiştirme işlemi: Alfanümerik/String:<br>";
settype( $degisken, string ); //alfanümerik/string (integer,double,booleon)
print "Değeri : ";
print "$degisken<br>";
print("Türü : ");
print gettype( $degisken ) ; //alfanümerik/string
print "<br>";
print "<br>";
Dört yararlı fonksiyon
isset() ve unset()
isset() fnksiyonu, PHP'nin bir değişkenin içinde değer bulunup bulunmadığını sınamasını sağlar. unset()
ise varolan bir değişkeni yok eder.
if (isset($bir_degisken)) {
print( $bir_degisken );
}
else {
unset($bir_degisken);
}
Bu kod parçası, $bir_degisken
isimli dğişkenin içi boş değişse, içeriğini görüntüleyecek, içi boş ise
varlığına son verecektir.
empty()
isset() fonksiyonun tersi işleve sahiptir; bir değişkene
değer atanmamışsa, veya değeri sıfır veya boş alfanümerik (null string)
ise, doğru (True) değeri verir.
$bir_degisken = 123;
echo empty($bir_degisken);
$bir_degisken = "";
echo empty($bir_degisken);
is_string(),is_integer(),is_double(),
Sınadıkları değişkenin aradıkları türden değer içermesi halinde doğru 'True) sonuç verirler.
<?php
$a = 6.567;
if (is_double($a)) {
print ("A Double'dır<br>");
}
$b = "Reşit";
if (is_double($a)) {
print ("B String'dir<br>");
}
$c = 6;
if (is_int($c)) {
print ("C Integer'dır<br>");
}
?>
Bu kod, Browser penceresine
"A double'dır, B String'dir, C
Integer'dır" yazdıracaktır. PHP'de bu fonksiyonlara benzeyen fakat başka
tür değer arayan şu fonksiyonlar da vardır: is_array(), is_object.
İşlemciler (Operatörler)
Aritmetik işlemciler:
+ Toplama 6+5 = 11
- Çıkartma 6-5 = 1
/ Bölme 6/5 = 1.2
* Çarpma 6*5 = 30
% Kalan (Modulus) 6%5 = 1
$sayi=4.5;
echo floor($sayi); =>> 4 (Sayıyı aşağıya yuvarlar)
echo ceil($sayi); =>> 5 (Sayıyı yukarıya yuvarlar)
echo round($sayi); =>> 5 (Sayıyı yuvarlar)
echo max(13,12,5,7); =>> 13
echo min(13,12,5,7); =>> 5
Rastgele Sayı
Srand((double)
microtime()*1000000);
echo rand(20,30) =>> (20-30 arası sayı döndürür)
PHP'nin atama işlemcisinin
eşittir (=) işareti olduğunu hatırlıyorsunuz birleşik-atama (combined-assignment)
işlemcileri, bu işarete diğer aritmetik işlemciler eklenerek oluşturulur.
İşlemci Örnek Anlamı
+= $a += 5 $a = $a + 5
-= $a -= 5 $a = $a - 5
/= $a /=5 $a = $a / 5
*= $a *= 5 $a = $a * 5
%= $a %= 5 $a = $a % 5
.= $a .= "metin" $a = $a" metin"
Bir Arttırmak
veya Azaltmak için
Değerleri sadece 1 arttırmak veya azaltmak için PHP,
bir kolaylık sağlar:
$a++ veya ++$a : $a'nın değerini 1 arttırır;
$a-- veya --$a : $a'nın değerini 1 eksiltir.
PHP'nin karşılaştırma yapması için kullandığımız
işlemciler ise işlem işaretinin sağı ve solundaki değerleri veya değişkenlerin
değerlerini işaretin belirttiği karşılaştırmayı yaptıktan sonra ortaya ya doğru
(true) ya da yanlış (false) sonucunu çıkartırlar.
İşlemci Örnek Örnek $a=6 ise:
== eşitse $a == 5 Yanlış/False
!= eşit değilse $a != 5 Doğru/True
=== aynı ise $a === 5 Yanlış/False
> büyükse $a > 5 Doğuru/True
< küçükse $a < 5 Yanlış/False
<= küçükse $a <= 5 Yanlış/False
veya eşitse
>= büyükse $a >= 5 Doğru/True
veya eşitse
PHP'de bu karşılaştırmayı iki
grubun arasına koyduğumuz işaretlerle yaparız İşaretin sağ ve sol tarafının
doğruluğu veya yanlışığı işarete göre nihai sonucun doğru veya yanlış
olmasını sağlar. Bu karşılaştırmaları yaparken
şu işlemcileri kullanırız:
İşlemci Adı Anlamı Örnek
|| veya sol veya sağ doğru doğru
|| yanlış = doğru
or veya sol veya sağ doğru doğru
|| yanlış = doğru
&& ve sol
ve sağ doğru doğru || yanlış = yanlış
and ve sol
ve sağ doğru doğru || yanlış = yanlış
Xor Şartlı-veya Sadece sol veya sağ doğru doğru
|| yanlış = doğru
! Değil sol veya sağ yanlış doğru || yanlış = doğru
<?php
$vize = 45;
$final = 65;
if ($vize >= 50 && $final >= 50) {
print ("Öğrenci geçti!");
}
else {
print ("Öğrenci kaldı!");
}
?>
Sabit Değerler
define
("SABIT_DEGER", değer);
Burada SABIT_DEGER yerine,
tanımlamak istediğimiz sabit değere vereceğimiz isim, değer yerine de sabit
değeri yazarız. Örnek:
<?php
$Dolar_miktar = 125;
define ( "DOLAR_KURU", 625675);
$TL_Tutar = $Dolar_miktar * DOLAR_KURU;
print ($TL_Tutar);
?>
Tanımlanmış olan bir sabiti
yeniden oluşturamayız; ama buna teşebbüs ettiğimizde PHP hata vermez. Bir sabit değerin oluşturulmuş
olup olmadığını defined()
fonksiyonu ile anlayabiliriz:
<?php
$Dolar_miktar = 125;
if (defined( "DOLAR_KURU" )) {
echo ("Sabit değer daha önce tanımlanmıştı.<br>");
}
?>
Dizi-Değişkenler
Dizi değişkenden ayrıntılı söz
edebilmek için önce tipik bir dizi-değişkende neler olduğuna bakalım.
Sözgelimi, verdiğiniz "PHP ile Programlama" kursundaki
öğrencilerinizin listesi şöyle olabilir:
Dizi Değişken Oluşturalım
Şimdi,
PHP bize öyle bir araç vermeli ki, biz bir kerede bu listenin tümünü, her bir
ögesine sanki bir değişkenin değeri imiş gibi tek-tek, veya bir kaçına birden
ulaşabilmeli ve arzu ettiğimiz zaman notları doldurabilmeliyiz. Öğrenciler de
yapacağımız Web sitesine girerek, kendi notlarını görebilmeli ve notlarını
inceleyebilmeli. PHP'nin bu amaçla sağladığı araç, çok-boyutlu dizi-değişken
oluşturma aracıdır. Ve bu araçla yukarıdaki listeyi aynen şöyle yapabiliriz.
<?php
$ogrenciler = array (
array ( adi => "Özbay", soyadi => "Altun", sinav1 =>"", sinav2 =>"", not =>""),
array ( adi => "Muharrem", soyadi => "Taç", sinav1 =>"", sinav2 =>"", not =>""),
array ( adi => "Hasan", soyadi => "Civelek", sinav1 =>"", sinav2 =>"", not =>""),
array ( adi => "Şahika", soyadi => "Tabak", sinav1 =>"", sinav2 =>"", not =>""),
);
// Buraya başka kodlar girecek
print $ogrenciler[0][adi];
?>
Programdaki
"print()" komutunu sadece dizi değişkeni doğru yazıp yazmadığımızı
sınamak amacıyla yazdık; bu programı Browser'da açtığınızda yazdığınız ilk ismi
Browser penceresinde görüyorsanız, dizi-değişkeni doğru şekilde oluşturdunuz
demektir. Burada, array() komutnu yazarken, süslü parantez değil, normal
parantez kullandığımıza ve herbir elemanın değerlerinin sonunda vrigül olduğuna
dikkat edir. Bir diğer önemli nokta: endeks adları bir kelimeden fazla ise
bunları tırnak içine alarak belirtmektir. Örneğin:
array ( adi => "Özbay", soyadi => "Altun", "Sinav 1 Notları" =>"", "Sinav 2 Notları" =>"", "Toplam Not Ortalamasi" =>""),
Burada,
daha öncekilere benzer bir şekilde adlandırılmış $ogrenciler değişkenin
içeriğini array() komutu ile doldurduğumuzu görüyoruz. Array() ile böyle
çok boyutlu ve içerdiği değerlerin her birinin bir "endeks adı" olan
dizi-değişkene İlişkili Dizi (Associative array) de denir. Perl bilenler
ise bu tür değişkenlere "Hash" dendiğini hatırlayacaklardır. İlişkili
Dizi'lerin birinci satırı 0, ikinci satırı 1, üçüncü satırı 2.. diye
numaralandırılır. Bu dizinin o satırındaki kaydın sıra endeksidir. Ayrıca
burada "adi," "soyadi," "sinav1" .. dizi
değişkenin içindeki değerlerin endeks adıdır. Yani bu değerlere atıfta
bulunurken, referans yaparken veya bu değerleriekullanmak amacıyla erişirken
sıra endeksi ve endeks adıyla hitabederiz. Yukarıdaki sınama amaçlı print()
komutuna bakarsanız, birinci öğrencinin ismini "[0][adi]" olarak
çağırıyor.
Çok
elemanlı ilişkili dizi oluşturmanın bir diğer yolu, yeri geldiğinde böyle bir
dizi için yeni bir üye ilgili bilgileri eleman endeksi ve değerler için endeks
adı belirterek şöyle bir kod yazmaktan ibarettir.
<?php
$ogrenciler[0][adi] = "Özbay";
$ogrenciler[0][soyadi] = "Altun";
$ogrenciler[0][sinav1] = "";
$ogrenciler[0][sinav2] = "";
$ogrenciler[0][not] = "";
// Buraya Buraya başka kodlar girecek
print $ogrenciler[0][adi];
?>
Bir
dizi değişkende kaç boyut olacaksa, o kadar içiçe array() ögesi
oluşturabiliriz. Buna göre tek boyutlu bir dizi değişken sadece bir array()
komutu ile ve sadece değerler verilerek oluşturulabilir. Diyelim ki yukarıdaki
öğrenci listemiz sadece öğrencilerin isimlerinden oluşacak. Bu durumda
$ogrenciler değişkenine ilişkin satırı şöyle yazabilirdik:
$ogrenciler = array ("Özbay", "Muharrem", "Hasan", "Şahika");
PHP,
böyle tek boyutlu bir dizinin örneğin birinci elemanını,
"$ogrenciler[0]" adıyla bilir. Böyle bir tek-boyutlu diziyi
oluşturmak için PHP bize başka bir kolaylık da sağlar: array() komutunu
kullanmadan, doğruca dizinin ögelerine
değer vermemiz mümkündür. Yukarıdaki programın sadece PHP bölümünü şöyle
değiştirerek kaydedin:
<?php
$ogrenciler[] = "Özbay";
$ogrenciler[] = "Muharrem";
$ogrenciler[] = "Hasan";
$ogrenciler[] = "Şahika";
// Buraya başka kodlar girecek
print $ogrenciler[0];
?>
Böyle
sırayla dizi değişken oluşturur veya oluşturulmuş bir dizi değişkene ek
yaparken, değişkenin sıra numarasını yazmazsak, PHP bunları kendisi sıralar.
Yukarıdaki kodun da Browser penceresine "Özbay" yazdırması gerekir.
Mevcut tek-boyutlu bir dizi değişkene ek yaptığımızda, be yeni değerin dizinin
en altına eklenmesini istiyorsak, sıra numarası yazmamıza gerek yoktur. Mevcut
değerlerden birini değiştirmek istiyorsak, o değerin sıra numarasını yazmamız
gerekir. Bunu denemek için yukarıdaki kodu şöyle değiştirilim
<?php
$ogrenciler[] = "Özbay";
$ogrenciler[] = "Muharrem";
$ogrenciler[] = "Hasan";
$ogrenciler[] = "Şahika";
// Buraya başka kodlar girecek
$ogrenciler[0] = "Emre";
$ogrenciler[15] = "Özbay";
print ("Dizideki 1'nci isim: $ogrenciler[0] <br>");
print ("Dizideki 2'nci isim: $ogrenciler[1] <br>");
print ("Dizideki 3'ünci isim: $ogrenciler[2] <br>");
print ("Dizideki 4'üncü isim: $ogrenciler[3] <br>");
print ("Dizideki 5'inci isim: $ogrenciler[4] <br>");
print ("Dizideki 6'ncı isim: $ogrenciler[5] <br>");
print ("..............<br>");
print ("Dizideki 15'nci isim: $ogrenciler[15] <br>");
?>
Bu
programın Browser penceresine göndereceği sırada, birinci öğrenci ($ogrenci[0])
olarak bu kez Özbay değil Emre yazdığını göreceğiz.
Bunun
sebebi, diziyi oluşturan ilk grup deyimden sonra,
$ogrenciler[0] = "Emre";
satırı
ile birinci elemanın değerini değiştirmiş olduk. 15'nci elemana atama yapmakla,
PHP'nin $ogrenciler dizisinde 6, 7, 8, 9,.. 14'e kadar boş elemanlar
oluşturmasına sebep olduk.
Tek
boyutlu dizileri de İlişkili Dizi olarak oluşturabilir yani değerlere endeks
adı verebiliriz.
<?php $ogrenci[adi] = "Özbay";
$ogrenci[soyadi] = "Altun";
$ogrenci[sinav1] = "";
$ogrenci[sinav2] = "";
$ogrenci[not] = "";
// Buraya başka kodlar girecek
print $ogrenci[adi];
?>
PHP,
$ogrenci adlı değişkenin beş ayrı değeri olduğunu ve bunların "adi,"
"soyadi," "sinav1"... olduğunu biliyor. Şimdi artık
istediğimiz noktada bu değişkenin istediğimiz değerine, o değerin endeks adını
yazarak, çağrıda bulunabiliriz; bu değeri yeniden verebiliriz.
Dizi değişkenleri kullanalım
Yukarıdaki
paragrafta "..değişkenin istediğimiz değerine, o değerin endeks adını
yazarak, çağrıda bulunabiliriz.." dediğimizi görmüş olmalısınız. Dizi veya
tekil, değişkenleri oluşturmamızın sebebi, tuttukları değerleri programımızın
gereği olan şekilde ve yerde kullanmaktır. Sadece bir değer tutan değişkenleri
örneğin print() komutu ile sık sık kullandık. Yukarıda dizi değişken
örneklerinde de bazı değişkenleri ve değerlerini çağırdık. Ancak dizi
değişkenlerin değerlerinden yararlanabilmek için başka araçlar da vardır.
Herşeyden
önce dizi değişkenlerin büyüklüğü, boyutu bizim için önem taşıyabilir.
Özellikle bir veritabanı dosyasını okutarak oluşturacağımız dizi değişkenin kaç
elemanı ve her bir elemanın kaç ögesi bulunduğunu bilmemiz gerekebilir.
Bir
dizi değişkenin kaç elemanı bulunduğu, o değişkenin count() özelliği
sorgulanarak öğrenilir. count(), dizideki eleman sayısını verir. Şimdi
bunu bir örnekle görelim.
<?php
$ogrenciler[] = "Özbay";
$ogrenciler[] = "Muharrem";
$ogrenciler[] = "Hasan";
$ogrenciler[] = "Şahika";
// Buraya başka kodlar girecek
print ("\$ogrenciler adlı dizide ". count($ogrenciler) ." adet eleman var.");
?>
Bu
program Browser penceresine dizimizde 4 eleman bulunduğunu bildirecektir. Şimdi
işleri biraz karmaşık hale getirelim! Yukarıdaki kodun, print() satırının
yerine şu satırları ekleyerek, kaydedelim.
print ("\$ogrenciler adlı dizide ". count($ogrenciler) ." adet eleman var.");
print ("<br><br>");
for ($sayac=1 ; $sayac <= count($ogrenciler) ; $sayac++ ) {
print ("\$ogrenciler dizisinin ". $sayac ."'ncı elemanı: " . $ogrenciler[$sayac] ."<br>");
}
Bu programı çalıştırmadan
önce, eklediğimiz satırları irdeleyelim. İlk print() komutunun Browser
penceresine "yazdıracağı" metinde geçen ters bölü işaretini
hatırlıyor olmalısınız. Bu, tek veya çift tırnak içine de almış bile olsak,
PHP'nin, bir değişken adını gördüğü zaman onun yerine o değişkenin tuttuğu
değeri yazması sebebiyle, $ işareti gibi PHP için özel anlamı olan işaretlerin
anlamlandırılmasını önlemek için yaptığımız ve adına o karakteri kurtarma veya ESCaping
dediğimiz işlemdir. Bu işlemle, PHP'nin anlamlı işaret değil de metin saymasını
istediğimiz karakterlerin önüne ters bölü işareti koyarız: \" gibi.
Buradaki örnekte, bu sayede PHP "$ogrenciler" kelimesini değişken adı
olarak değil, düz metin olarak görüyor. Ki, aynı komutta aynı kelimeyi tekrar
kullandığımızda bu kez değişken adı olarak kullanıyoruz ve bu değişkenin count()
ögesinin değerini öğreniyoruz. $ogrenci değişkenin "Özbay,"
"Muharrem," "Hasan" ve "Şahika" değerleri
bulunduğuna göre, bu değişkenin count()'u 4 olacaktır.
("Ozbay" = 0, .. "Şahika" = 3 olmak üzere..) Bu print()
komutu, Browser penceresine tahmin ettiğiniz gibi "$ogrenciler adlı dizide
4 adet eleman var." yazdıracaktır. İkinci print() satırı ise ekrana
ardarda iki yeni satır işareti gönderecektir.
Şimdi karışık noktaya
geliyoruz! Burada bir for döngüsü başlıyor. Önce döngünün kaç kez tekrar
edeceğini belirleyecek olan değişkeni tanımlıyoruz: $sayac. Sonra bu sayacın
kaça kadar çıkacağını belirliyoruz. Bu
sayıyı, bize yine count() veriyor. Ve
tabiî for döngüsünün devam edebilmesi için gerekli son unsur olan, sayacın
arttırılmasını sağlayan deyim var. Programımız bu döngünün içinde, yani dört
kez, her seferinde dizinin bir elemanın adını Browser penceresine gönderiyor.
Şimdi, hatırlayacaksınız, dizi değişkenlerin elemanlarının bir sıra sayısı
vardı. Örneğin "Şahika" değeri, dizinin 3 numaralı, yani dördüncü
elemanı; ve bu elemanın değerini ekrana göndermek için şu komutu vermemiz
yeterli:
print ($ogrenciler[4]);
Programda ise buradaki endeks
sayısını, $sayac değişkeninin o andaki değerinden alıyoruz. Döngünün her
seferinde bu değer bir artacağı için bize $ogrenciler değişkeninin o anda hangi
elemanının değeri çağırmak istiyorsak, o elemanın endeksini vermiş olacaktır.
Ve sonuç olarak programımız, dizideki bütün değerleri Browser'a gönderecektir.
Kimi
zaman buradaki örnekte olduğu gibi, dizinin bütün elemanlarını bir for
döngüsüyle değil, foreach döngüsüyle bulmak daha kolay olabilir. Kısaca
belirtmek gerekirse, foreach döngüsü, bir dizi değişkenin bütün
elemanları için, arzu ettiğiniz işi yapar. foreach döngüsünü yazarken
komutun kaç kere icra edileceğini bir sayaçla tutmak gerekmez; çünkü döngü, ona
adını verdiğiniz değişkenin içindeki bütün değerler bitinceye kadar devam
edecektir.
foreach ($ogrenciler as $ogrenci) {
print ("$ogrenci<br>");
}
foreach döngüsü, bir dizi değişkenin adını içinden değer
çekilecek kaynak olarak ister; bunu "as" (olarak) kelimesi
izler; sonra diziden alınacak her bir değeri geçici olarak tutacak değişkenin
adı verilir. Buradaki print() komutumuz, bu geçici değişkenin tuttuğu
değeri Browser'a gönöderecektir. Bu değer ise döngünün her adımında dizi
değişkendeki bir değer yani öğrencilerin listesi olacaktır.
Dizi
elemanlarının farklı özelliklerine ilişkin değerlere endeks adı verdiğimiz
ilişkili dizilerde ise eleman değerlerini çağırmak foreach döngüsünün
biraz farklı yazılmasını gerektirir. Perl'e aşina alanların bu dizi türüne
"hash" dendiğini hatırlayacaklardır. PHP'de de Perl'ün hash türü
değişkenlerinde olduğu gibi, endeks adlarına "anahtar" (key),
bu endeksin belirlediği değere ise (evet, doğru tahmin ettiniz!) değer (value)
denir. İlişkili dizilerden değer almak üzere foreach döngüsü yazılırken,
değerin anahtarını ve değerin kendisini iki geçici değişkene yazmamız gerekir
foreach ($ogrenciler as $anahtar=>$deger) {
print ("$anahtar = $deger<br>");
}
Bu kodu çalıştırmadan önce foreach
döngüsü üzerinde kısaca duralım: döngü, $ogrenciler dizisini okumaya
başladığında içinde, benzetme yerinde ise, iki sütun, ve bir çok satırlar
bulacaktır. Bu sütunlardan birincisi, ikinci sütundaki verinin adıdır; foreach,
birinci sütundaki veriyi alarak $anahtar adlı geçici değişkenin değeri
olarak atayacak; sonra ikinci sütuna geçecek ve bunu alarak $deger adlı
geçici değişkenin değeri yapacaktır. Döngü, daha sonra print() komutunu icra
edecektir. print() ise ve geçici $anahtar değişkeninin değerini,
ardından eşittir işaretini ve son olarak da geçici $deger değişkeninin
değerini Browser'a gönderecektir. print() komutunun icrası bitince, foreach,
kendisine verdiğimiz $ogrenciler değişkeninde anahtar-değer çiftini ele almadığı
satır kalıp kalmadığına bakacak, ve elemanların tümü bitinceye kadar bu işlemi
tekrar edecektir. Tabiî, sonuç anahtar ve değerlerin altalta sıralanması
olacaktır.
Bir de bu bölümün en başında
ele aldığımız çok elemanlı ilişkili diziler vardı. Onların içindeki değerleri
acaba nasıl alabilir ve kullanabiliriz? Tabiî yine bir döngü ile. Fakat bu kez,
döngü-içinde-döngü kullanmak zorundayız. Böyle bir diziyi gözümüzde
canlandırırsak, belki neden iki döngüye ihtiyaç olduğununu daha iyi
görebiliriz. Gözümüzün önüne bir tablo getirelim: dizinin her bir elemanı
(bizim öğrenimizde öğrenciler9 bir satırda yer almış olsun; sütunlar olarak da
bu elemana ait değerler yer alıyor. Sütun başlığı ise, bu değerin endeksi olan
anahtar
foreach ( $ogrenciler as $ogrenci ) {
foreach ( $ogrenci as $anahtar => $deger ) {
print ("$anahtar = $deger <br> ");
}
print ("<br>");
}
Kısaca irdelersek, bu kodda foreach
döngüsünün önce çok-boyutlu değişkenimizin bir satırını içindeki bütün
anahtar+değer çeftleri ile ele alıp, tümünü $ogrenci adlı değişkene geçici
olarak yerleştirdiğini görüyoruz. Bu foreach döngüsünün ilk işi yeni bir
foreach döngüsü başlatmak oluyor. Yeni foreach ise sazı eline
alır almaz, önce, kendisi çok ögeli bir değişken olan (çünkü içinde bir
öğrenciye ait, tüm değişkenler ve onların endeks adları var) $ogrenci
değişkeninin içindeki anahtar ve değer çiftlerini tek-tek, $anahtar ve $deger değişkenlerine
yerleştiriyor; sonra print() komutu ile, aralarına eşittir işareti
koyarak bu değişkenlerin değerlerini Browser penceresine gönderiyor. Bu döngü
biter bitmez, ilk foreach yaptıracağı işlere kaldığı yerden devam
ediyor; ve ekrana bir yeni satır komutu gönderierek, başa dönüyor; bu kez çok
boyutlu dizi değişkenin yeni bir elemana geçiyor. Taa ki, dizinin bütün
elemanları ve elemanların bütün ögeleri bitinceye kadar.
Bu noktada bir uyarı: Gerçek
programda bir dizinin elemanlarına ilk ulaştığımızda, elemanın içinde değer
bulunup bulunmadığını anlamak yerinde olur. Bunu is_array() fonksiyonu ile
yapabiliriz. Bu fonksiyon, dizinin içinde değer varsa, True/Doğru, yoksa
False/Yanlış karşılığını verecektir. Buradaki örnekte, ilk foreach
satırından hemen sonra:
is_array( $ogrenci )
satırını koyarak, dizinin o
anda okunan elemanın içinde değer bulunup bulunmadığını anlayabiliriz.
Dizi Değişkenlerin Düzenlenmesi
Dizi değişkenlerin daha
verimli şekilde kullanılması için PHP bize bir takım araçlar sağlar. Bunlarla
dizi değişkenleri birleştirebiliriz; içinden kesit alabiliriz, sıralayabiliriz
veya bazı elemanlarını silebiliriz. Şimdi kısaca bu işlemleri ele alalım:
Dizileri birleştirme: array_merge()
İki veya daha fazla dizinin
bütün elemanlarını birleştirerek, ortaya
yeni bir dizi çıkartır. Örnek:
$birinci_dizi = array ( "Özbay" , "Muharrem" , "Hasan" , "Şahika" );
$ikinci_dizi = array ( "Altun" , "Taç" , "Civelek" , "Tabak" );
$yeni_dizi = array_merge ( $birinci_dizi, $ikinci_dizi );
Bu kod ile oluşturulan
$yeni_dizi isimli dizi değişkenin hangi elemanlara sahip olduğunu, şöyle bir
kodla görebilirsiniz:
foreach ( $yeni_dizi as $yeni_eleman ) {
print (" $yeni_eleman <br>");
}
İkinci dizinin bütün
elemanları, birinci dizinin elemanlarının arkasına eklenmiş olmalı. array_merge()
işlemi, çok-boyutlu ilişkili dizilere de uygulanabilir; PHP iki dizideki
uyumlu-uyumsuz, yani birinde olan diğerinde olmayan bütün anahtar+değer
çiftlerini yeni dizide de oluştur. (array_merge() işleminden sonra
birleştirilen dizilerin değişmeden kaldığına dikkat edin.)
Dizilere değişken ekleme: array_push()
Bir diziye yeni değişkenler
eklemek için, array_push() fonksiyonuna mevcut dizinin adını ve yeni
değerleri yazarız. Örnek:
$birinci_dizi = array ( "Özbay" , "Muharrem" , "Hasan" , "Şahika" );
$yeni = array_push ($birinci_dizi, "Altun" , "Taç" , "Civelek" , "Tabak" );
Burada $yeni adlı değişken
sadece $birinci_dizi adlı dizinin yeni eleman sayısını tutar. array_push(),
kendisine adını verdiğimiz dizinin içeriğini değiştirir. Yukarıdaki örnekte
içine yeni değerler yazılan dizinin elemanlarını görüntülemek için şöyle bir
kod yazabiliriz:
print ("\$birinci_dizi adlı dizide $yeni_dizi adet değişken var<br>");
foreach ( $birinci_dizi as $ogrenci ) {
print ("$ogrenci <br> ");
}
Dizinin ilk elemanını silme: array_shift()
Bir dizi-değişkenin ilk
elemanını tümüyle silmek için array_shift() fonksiyonunu kullanırız. Bu
fonksiyona sadece birinci elemanı silinecek dizinin adını vermek yeter.
Örnek:
$birinci_dizi = array ( "Özbay" , "Muharrem" , "Hasan" , "Şahika" );
$silinen = array_shift ($birinci_dizi);
array_shift(), adını verdiğiniz dizinin içeriğini değiştirir;
buradaki örnekte, $silinen adlı değişken dizinin silinen birinci elemanın
değerini tutar.
Diziden kesit alma: array_slice()
Bir dizi-değişkenin bütün
elemanları yerine bir kesitini kullanmak istiyorsak, bunu array_slice()
fonksiyonu ile yapabiliriz. Bu fonksiyona kesit alınacak dizinin adı, kesitin
başladığı yer ve kaç adet değişken alınacağı argüman olarak verilir.
Örnek
$birinci_dizi = array ( "Özbay" , "Muharrem" , "Hasan" , "Şahika", "Altun" , "Taç" , "Civelek" , "Tabak");
$kesit = array_slice ($birinci_dizi , 3, 4);
Burada, PHP'ye $kesit adlı
yeni dizi değişkene, $birinci_dizi adlı dizinin 3'ncü değerinden itibaren (3
dahil) dört değeri yerleştirmesini bildiriyoruz. array_slice(), adını
verdiğimiz değişkenin içeriğine dokunmaz; yeni dizi değişken oluşturulur.
Dizileri sıralama: sort() ve rsort()
Bir dizinin içindeki değerleri
alfabetik veya küçükten büyüğe doğru sıralamak için sort() fonksiyonunu
kullanırız.
Örnek:
$birinci_dizi = array ( "Özbay" , "Muharrem" , "Hasan" , "Şahika", "Altun" , "Taç" , "Civelek" , "Tabak");
sort ($birinci_dizi);
PHP, dizideki bütün değerleri
A'dan Z'ye sıraya sokacaktır. sort() fonksiyonu dizinin içeğini
değiştirir. Bir diziyi Z'den A'ya veya büyükten küçüğe doğru sıralamak için de rsort()
fonksiyonunu kullanabilirsiniz. (PHP4.0 Türkçe karakterleri tanımıyor.) Bir
noktada dikkatli olmak gerekir: bu fonksiyonu ilişkili (değerlerin anahtarı
olarak endeks adı bulunan) dizide kullanırsanız, PHP, anahtar değerlerini
(endeks adlarını) atar, yerine 0'dan itibaren rakam koyar. Bunu önlemek için,
ilişkili dizileri asort() veya ksort() fonksiyonu ile sıralamak gerekir.
İlişkili dizileri sıralama: asort() ve ksort()
İlişkili dizilerin diğer dizi
değişkenlere göre farkı, değerlerinin bir de adı bulunmasıdır. Değerlerin
adlarına anahtar denir. Bir ilişkili diziyi değerlerine göre sıralamak için
asort() fonksiyonu kullanılır.
Örnek:
$birinci_dizi = array ( ogr_01=>"Özbay", ogr_02=>"Muharrem" , ogr_013>"Hasan" , ogr_04=>"Şahika");
asort ($birinci_dizi);
PHP, bu diziyi değerler itibariyle alfabetik sıraya sokacaktır. Eğer sıranın değere göre değil de değerlerin anahtarına (burada ogr_01, ogr_02 olan kelimeler) göre yapılmasını istiyorsak, ksort() fonksiyonunu kullanırız.
Örnek:
$birinci_dizi = array ( ogr_01=>"Özbay", ogr_02=>"Muharrem" , ogr_013>"Hasan" , ogr_04=>"Şahika");
ksort ($birinci_dizi);
PHP, şimdi bu diziyi
anahtarlara göre alfabetik sıraya sokacaktır.
Metin Düzenleme ve Düzenli İfadeler
substr($degisken,8);
substr ($degisken, 8, 20);
substr($degisken, -9);
trim ($degisken);
strlen($degisken);
strip_tags($metin) =>> (Metin içersindeki html ve php kodlarını atar)
strtolower($metin) =>> (Küçük harfe çevirir)
strtoupper($metin) =>> (Büyük harfe çevirir)
ucwords($metin) =>> (Sadece Baş Harfleri büyük yapar)
ucfirst($metin) =>>(Sadece cümlenin baş harflerini büyük yapar)
substr($metin,3,5) =>>(3. karekterden itibaren 5 karekter alır)
strpos($metin,”@”) =>>(İstediğim karekterin yerini söyler)
strstr($metin,”@”) =>>(İstediğim karekterden sonraki karekterleri alır)
substr_count($metin,”@”) =>> (İstediğim karekterden kaçtane olduğunu yazar)
$bolumler=explode(“,”,$metin) =>> ( (,) ler arasındaki ifadeleri dizi değişkenine aktarır)
implode(“,”,$bolumlar”) =>>
( Dizideki değerleri (,) işareti ile bağlar)
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 nokdtadan) 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
str_replace ()
str_replace("<script","<yasak_script",$satir[mesaj]);
number_format()
$degisken = 1234567890.1234567890 ;
echo (number_format($degisken, 4 chr(44) , ".") ); //chr(44)=virgü
Bu deyimle
1234567890.1234567890 şeklindeki değer, Browser penceresine
"1.234.567.890,1235" şeklinde yazdırılacaktır.
Düzenli İfadeler
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.
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.
edilemez$
Bu deyim ise PHP'ye
"edilemez" ile biten bütün kelimeleri bulur
^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.
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.
Düzenli İfade 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)) {
}
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.
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. 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