Hakkında Künye

Düzenli İfadeler-2

Geçen ayki yazımızda, düzenli ifadelerin (regular expression, RegExp, ...) ne olduğundan, kullanım amaçlarından ve söz diziminden bahsedip, bir takım örnek ifadelere yer vermiştik. Bu ay, söz dizimini öğrendiğimiz düzenli ifadeleri ne şekilde kullanabileceğimizi göreceğiz.

Pratik Kullanım Alanları

Düzenli ifadeler, vi, emacs, kate gibi pek çok metin düzenleyicide; grep, sed gibi konsol uygulamalarında; Perl, Python, PHP, JavaScript gibi programlama dillerinde ve Eclipse, Visual Studio gibi geliştirme ortamlarında kullanılmaktadır. Şimdi, bu uygulamalardan bazılarını görelim ve örneklerle farklı kullanım amaçlarını tanımaya çalışalım.

grep

Grep (Global Regular Expression Parser), Linux konsol ortamında düzenli ifadeleri kullanabilmemizi sağlayan en temel programdır. Normal kullanımında iki argüman alır: "grep İFADE DOSYAADI". Dosya adı girilmezse, grep, standart girdiden okur. Örneğin "/etc/passwd" dosyasında murat ifadesi geçen satırları bastırmak için şöyle bir komut kullanabiliriz:

murat@tulliana ~ $ grep murat /etc/passwd
murat:x:1000:100:Murat Ongan:/home/murat:/bin/bash
murat@tulliana ~ $

Bu tip kelime şeklindeki ifadeleri aramanın yanı sıra, daha karmaşık düzenli ifadeleri de arayabiliriz. Örneğin ODT[UÜ] .* Toplulu[gğ]u ifadesini bir dosyada aratmak istediğimizde şöyle bir komut kullanabiliriz:

murat@tulliana ~ $ cat dosya
ODTÜ Bilgisayar Topluluğu
METU Computer Club
odtü bilgisayar topluluğu
ODTU Bilgisayar Toplulugu
ODTÜ bilgisayar Topluluğu
CClub
murat@tulliana ~ $ grep "ODT[UÜ] .* Toplulu[gğ]u" dosya
ODTÜ Bilgisayar Topluluğu
ODTU Bilgisayar Toplulugu
ODTÜ bilgisayar Topluluğu
murat@tulliana ~ $

Daha önce belirttiğimiz gibi, grep'e girdi olarak, bir dosya içeriği vermek yerine, bir komutun çıktısını da verebiliriz. Örneğin, daha önce bilgisayarımızda kullandığımız "wget" programını hangi argümanlarla çağırdığımızı hatırlamak için, şöyle bir komut deneyebiliriz:

murat@tulliana e-bergi $ history | grep wget
  530  wget http://www.domain.com/~user/foto/ -r -np -nH --cut-dirs=2 -A.JPG
  534  history | grep wget
murat@tulliana e-bergi $

KWrite - Kate

Kate, KDE masaüstü ortamının metin düzenleme aracıdır. Aynı zamanda da çok fonksiyonlu bir editör olarak kullanılabilir. KWrite da Kate'i kullanabilen basit ama kullanışlı bir metin düzenleyicidir. Bu uygulamalar, düzenli ifade kullanımını destekler ve bunun için kullanışlı bir arabirim de sunar.

Şimdi, KWrite'ta düzenli ifadeleri kullanarak nasıl arama yapıldığını bir örnek üzerinde görelim. Yukardaki resimlerde gösterildiği gibi, önce örnek metin olarak Google'ın HTML kodunu açıyoruz. Amacımız, burdaki tüm linkleri düzenli ifadeleri kullanarak bulmak. Ctrl+F tuşlarını kullanarak, ya da menüden Düzen -> Bul (Edit -> Find) seçeneğini seçerek, düzenleme penceresini açıyoruz. Bir düzenli ifade aratmak istediğimizi belirtmek için, çıkan penceredeki Düzenli ifade (Regular expression) seçeneğini işaretliyoruz. Daha sonra arama kutusuna, <a href="adres" ..> şeklindeki yapıları bulmak için <a href=[^>]*> ifadesini girip, Bul (Find) tuşuna bastığımızda, bize ilk eşleşen ifadeyi seçilmiş bir şekilde gösteriyor. Bundan sonra, menüden Düzen -> Sonrakini Bulu (Edit -> Find Next) seçerek ya da F3 tuşuna basarak bu türdeki tüm ifadeleri görebiliyoruz.

KWrite aracılığıyla düzenli ifadeleri kullanarak arama yapabildiğimiz gibi, bulduğumuz metinleri değiştirme şansına da sahibiz. Bunu da yine bir örnekle görelim. Aşağıdaki resimlerde görebileceğiniz gibi, bu sefer örnek metin olarak bir HTML formundan alınmış şehir listesini kullanıyoruz. Bu listede şehirlerin isimlerinin yanı sıra, Türkçe karakterlerden arındırılmış hali de mevcut. Bu listeyi alıp, kendi PHP sayfamızda kullanabilmek için bir dizi (array) haline çevirmek istiyoruz.

Bu sefer, menüden Düzen -> Değiştiri (Edit -> Replace) seçiyoruz ya da Ctrl+R kısayolunu kullanıyoruz. Çıkan pencerede yine Düzenli ifade (Regular expression) seçeneğini ve değiştirme işleminde bulduğumuz metinlerdeki parçaları kullanacağımızı belirtmek için Konum tutucuları kullan (Use placeholders) seçeneğini işaretliyoruz. Üstteki kutucuğa aradığımız metnin formatı olan <option value="(.*)">(.*)</option> ifadesini, alttaki kutucuğa da değiştirmek istediğimiz metnin formatı olan $dizi["\1"] = "\2"; ifadesini giriyoruz. Değiştir (Replace) tuşuna bastığımızda, girdimiz, yeni formatında kullanılabilir hale geliyor. Özellikle büyük ölçekte verinin formatını değiştirmek istediğimizde bu yöntemin çok işe yaradığını görüyoruz.

JavaScript

Pek çok programlama dilinde olduğu gibi, JavaScript'te de düzenli ifadelerin kullanılabildiğini biliyoruz. Özellikle web sayfalarında girilen form bilgilerini doğrulamak (form validation) için düzenli ifadelerden sıkça yararlanıyoruz. Bunun için, öncelikle bir RegExp nesnesi yaratmamız gerekiyor. Bu nesne, aşağıda gösterildiği gibi iki farklı yolla yaratılabilir. İkinci satır, birincisi için bir kısa gösterimdir yoludur.

var re = new RegExp("ifade");
var re = /ifade/;

Bu şekilde yaratılan düzenli ifade nesneleri, bu nesnelerin test metoduyla doğrulanabilir. Şimdi yine bir örnekle, JavaScript'te düzenli ifadeleri kullanarak e-posta adreslerini nasıl doğrulatabileceğimizi görelim. Web sitemizde kullanabileceğimiz doğrulama fonksiyonu ve bu fonksiyonu kullanan form kodu aşağıda gösterilmiştir. Ayrıca, bu kodun nasıl çalıştığını görmek için örnek sayfamızı inceleyebilirsiniz.

<script type="text/javascript">
function formKontrol() {
    var ifade = new RegExp("^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$");
    // var ifade = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
    var adres = document.mailform.mailadresi.value;
    if (ifade.test(adres)) {
        alert("E-Posta adresiniz, kurallara uygun gözüküyor. Formunuz gönderilecek..");
        return true;
    }
    else {
        alert("E-Posta adresiniz, kurallara uygun değil. Lütfen adresi kontrol edip tekrar deneyin..");
        return false;
    }
}
</script>

<form name="mailform" onSubmit="return formKontrol()">
<input type="text" name="mailadresi" size="15">
<input type="submit" value="Gönder!">
</form>

PHP

Biraz önce JavaScript ile nasıl form doğrulama işlemi yapabileceğimizi gördük. Ancak, JavaScript özelliği kapalı olan tarayıcılardan veya bazı kötü amaçlı kişilerden gelebilecek form verilerini kontrol edebilmek için, sunucu tarfında da bir doğrulama işlemi yapmamız şarttır. PHP de düzenli ifadelerin kullanılabildiği programlama dillerinden biri olarak, form doğrulama işlemlerinde sık sık kullanılır.

PHP'de düzenli ifadeler ereg ve ereg_replace fonksiyonlarıyla kullanılır. ereg fonksiyonu, standart olarak iki argüman alır. İlk argümanda, aramak istediğimiz ifadeyi, ikinci argümanda ise aramayı yapacağımız metni girmemiz gerekir. Fonksiyon, ifadeyi metnin içinde bulabilirse 1, bulunmazsa 0 değerlerini döner. İstersek, metinde eşleşen parçaları alabilmek için, ereg fonksiyonuna üçüncü bir argüman da verebiliriz. Aşağıdaki örnekte, e-posta doğrulama işlemini bu sefer PHP ile sunucu tarafında nasıl yaptığımızı görebilirsiniz. İsterseniz örneğimizin nasıl çalıştığını görebilir ya da kodun tamamını inceleyebilirsiniz.

$ifade = "^([a-zA-Z0-9._-]+)@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})$";
if (ereg($ifade, $_POST["mailadresi"], $sonuclar)) {
    echo "<p>E-Posta adresi onaylandı. Teşekkür ederiz..</p>";
    echo "<p><b>Adres:</b> ".$sonuclar[0]."<br />";
    echo "<b>Kullanıcı Adı:</b> ".$sonuclar[1]."<br />";
    echo "<b>Alan Adı:</b> ".$sonuclar[2]."</p>";
}
else {
    echo "<p>E-Posta adresi doğrulanamadı. Lütfen geri dönüp, tekrar deneyin..</p>";
}

Gördüğünüz gibi, düzenli ifadeler, PHP'de kolay bir şekilde arama ve doğrulama yapma amacıyla kullanılabiliyor. Şimdi de ereg_replace fonksiyonu ile metinler üzerinde nasıl değişiklik yapabileceğimize dair bir örnek görelim. Bu fonksiyon, üç argümanla çağrılır. İlk argüman, aramak istediğimiz düzenli ifade; ikinci argüman, bulduğumuz metinleri değiştirmek istediğimiz ifade; üçüncü argüman da üzerinde değişiklik yapmak istediğimiz metindir. Fonksiyon, değiştirilmiş metni bize döner.

Örneğimizde, bir metnin içinde geçen, http:// ile başlayan sözcükleri tıklandığında yeni sayfada açılan bağlantılar haline getireceğiz. Bu yöntem, çeşitli Internet sitelerinde, veritabanından alınan düz metinleri html haline getirmek için sıkça kullanılmaktadır.

$metin = "
Merhaba,

ODTÜ Bilgisayar Topluluğu tarafından düzenlenen geleneksel programlama yarışmasına siz de katılabilirsiniz. Yapmanız 
gereken tek şey, ön eleme sorularına web üzerinden çözüm göndermek. Yarışma hakkında daha detaylı bilgi almak için, 
http://www.cclub.metu.edu.tr/yarisma sayfasını ziyaret edebilir, ya da 
http://www.cclub.metu.edu.tr/yarisma/2008/on_eleme_sorulari sayfasından ön eleme sorularına ulaşabilirsiniz.

Murat Ongan
ODTÜ Bilgisayar Topluluğu
http://www.cclub.metu.edu.tr/
";
echo "<p><b>Orjinal Metin:</b></p>";
echo "<p>".nl2br($metin)."</p>";

$eskiifade = "http://[^ \n\t,]*";
$yeniifade = "<a href='\\0' onclick='window.open(this.href); return false;'>\\0</a>";
$yenimetin = ereg_replace($eskiifade, $yeniifade, $metin);

echo "<p><b>Değiştirilmiş Metin:</b></p>";
echo "<p>".nl2br($yenimetin)."</p>";

Yukarıdaki kodun, nasıl çalıştığını görmek için ereg_replace örneğini inceleyebilirsiniz.

Gelecek Ay

Bu yazımızda, çeşitli uygulamalarda düzenli ifadeleri nasıl kullanabileceğimizi, pratik örneklerle incelemeye çalıştık. Önümüzdeki ay yayınlayacağımız, serimizin son yazısında ise ilk iki yazıda değinmediğimiz birkaç ayrıntıdan bahsedecek ve sık kullanılan bazı kalıpları sizinle paylaşacağız. Önümüzdeki ay tekrar görüşmek dileğiyle..

Kaynaklar



Murat Ongan
- 5 -