Regular Expression öğrenelim, PHP ve MySql ile kullanalım

Standard

Aslında herkesin bi çok zaman işini kolayca çözebileceği ama kulağını tersten tuttuğu, öğrenmekten kaçındığı bir şeydir regex.

Bu makale de genel bilgi, php ile kullanımı ve mysql ile kullanımını anlatacağım. isterseniz hemen genel kullanımına başlayalım:

Temel “Regular Expression” Yazımı
. herhangi bir karakter Nokta (.) herhangi bir karakteri(sayısal, dizgisel, özel, görünmez) ifade etmek için kullanılır. Örnekler:“do.” yazımı; dog”“dot”“doe”, hecelerinden herhangi birisine uygundur.
“d..r” yazımı; “door” ve “deer” ifadelerine uygundur.
* önceki karakterin sıfır veya çok sayıda tekrar edebileceğini ifade eder Yıldız (*) simgesi kendisinden önce gelen karakterin (veya grubun) sıfır kez (hiç) veya çok sayıda tekrar edebileceğini gösterir. Örnekler:“do.*” yazımı; “dog”“done”“doppleganger”, ifadelerini kapsamaktadır.“to*” yazımı; “to” ve “too” ifadelerine uygundur.“fre*..” yazımı;  “frat”“free”“from” ifadelerine uygundur.
+ önceki karakterin en az bir veya çok sayıda tekrar edebileceğini ifade eder Artı (+) simgesi * dan farklı olarak önceki karakter veya grubun en az bir defa bulunması koşulu getirir. Birden çok kez de tekrar edebilir. Örnekler:“fre+..” yazımı;  “freak”“freeze”“fresh” ifadelerine uygundur.
? önceki karakterin sıfır veya bir kez bulunabileceğini ifade eder Soru işareti (?) kendisinden önceki karakter veya grubun olmayabileceğini veya bir kez tekrar edebileceğini gösterir. Örnekler:“ton?e” yazımı; “toe” ve “tone” ifadelerine uygundur.
( )
gruplama Parantezler ( ) kalıpları (patterns) gruplamak için kullanılır. Burada amaç grup şeklinde işleme sokabilmektir. Örnekler:(dog|cat) yazımı; “dog” ve “cat” ifadelerine uygundur.
[] gruptaki herhangi bir karakter Köşeli parantez ([]) içinde barındırdığı kalıba göre bir karakter yerine geçer. Örnekler:“ta[pb]“ yazımı;  “tap” ve “tab” ifadelerine uygundur.“r[aeiou]t” yazımı; “rat”“ret”“rot”“rut” ifadelerine uygundur.“r[aeiou]+t” yazımı; “rat” (plus all of the above)“riot”“root”, … ifadelerine uygundur.
[^] gruptaki herhangi bir karakter hariç (^) Simgesi eğer köşeli parantez ([]) içinde kullanılırsa, bu kendisinden sonraki karakter veya grubun bulunmayacağını ifade eder. Örnekler:“t[^aeiou]+.*s” yazımı;  “thanks”“this”“trappings”, … ifadelerine uygundur.
{min,max} tekrar aralığı Küme parantezi ({}) ile bir önceki karakter veya grubun tekrar edilme miktarı tanımlanır. Eğer tek bir değer yazılırsa; yazılan değer kadar tekrar şarttır. Küme parantezi içine iki değer virgül ile ayrılarak yazılırsa; tekrar, soldaki küçük değerden az ve sağdaki büyük değerden fazla olamaz. Örnekler:“[a-z]{3}” Bu örnekte küçük “a” harfi 3 defa tekrarlanmak zorundadır. Aksi taktirde koşula uymayacaktır.“[0-9]{3,}” Bu örnekte ise ikinci değer tanımlanmadığından dolayı, en az 3 kez tekrarlanmalıdır. 3 ten çok tekrar kabul edilebilir.“[A-Z]{2,5}” Bu örnek ise alt ve üst limitlerin tanımlanmasıyla, en az 2 en fazla 5 kez tekrar edebilir.

 

Karakter Etiketleri Yer Belirteçleri
\d Herhangi bir rakam [0-9] ^ Satırbaşı (eğer m düzenleyicisi varsa)
\D Rakam olmayan herhangi bir simge [^0-9] $ Satır sonu (eğer m düzenleyicisi varsa)
\w Herhangi bir harf, rakam veya alt çizgi (Türkçe harfler hariç) (alfanümerik) [a-zA-Z0-9_] \b Kelime başlangıç simgesi (^ ve $ gibi dedektör)
\W Alfanümerik olmayan [^a-zA-Z0-9_] \B Kelime başlangıcı olmayan durumlar
\s Herhangi bir boşluk karakteri [ \t\n\r\f]
\S Boşluk karakteri olmayan [^ \t\n\r\f]

 

Özel Karakterler
\n Satırbaşı karakteri
\r Windows için satırbaşı ilk simgesi
\t Tab simgesi
\e escape karakteri
\xFF Onaltılık değer ör: “FF”

Şimdi RegEx i php ile kullanmaya bakalım;

Php de preg_match() fonksiyonu ile örnekler yaparak açıklayacağız, aksi halde biraz karışık geliyor.

Preg_Match($igne, $samanlik, $degerler);

Preg_Match() içerisinde regex kullanabilmemiz için kodlarımızı /…/ içerisine yazmamız gerekiyor.

/…./ php zorunlu kullanımı (en azından şuanda öyle biliyorum).
^ Yapılacak aramanın ^ karakterinden sonra gelen ilk karakterle başlayacağını gösterir.
$ Yapılacak aramanın $ karakterinden önce gelen ilk karakterle bittiğini gösterir.
[a-z] veya [A-Z] veya [0-9] veya [a-zA-Z0-9] belirtilen karakterler arasındaki karakterleri içeren aramaları yapar.
{0,5} Kendisinden önce gelen aramanın 0 (sıfır) ile 5 karakter arasında uzunluğa ulaşabileceğini belirtir.
\ Kendisinden sonra gelen karakteri etkisiz kılar.
( ) İçerisine yazılan aramayı ayrı bir degiskene atar.
* kendisinden önce gelen aramayı sınırsız sayıda tekrarlanabileceğini belirtir.
(?<degisken>…) Parantezde olduğu gibi … yerine gelecek olan aramaları <> içerisinde yazılan değişkene atar.

Gelelim MySQL ‘e

Mysql içersinde kullanılan Regex komutları birçok standart parametreyi kabul eder.

Örnek olarak: Diyelim ki sitenizdeki bazı üyeler isminin olması gereken yere yanlışlıkla telefon numarasını yazmış. Bu durumda sayı ile başlayan kayıtları listelemek yeterli olacaktır. Regex sayesinde bunu tek satırda yapmak mümkün

SELECT * FROM tablo WHERE isim REGEXP ´^[0-9]´

Başka bir örnek: Adının başında onu veya can olan üyeleri listeleyelim.

SELECT * FROM tablo WHERE isim REGEXP ´^(onu|can)´ ORDER BY numara
Genel hatları ile bu şekilde, şimdi ortaya karışık bi kaç örnek serpiştiriyorum:

Ufak tefek Örnekler

  1. </?[^>]+>
    HTML etiketlerini ifade eder.
  2. (((+|-)?\d+(\.\d*)?)|((+|-)?(\d*\.)?\d+))
    Negatif veya pozitif tam ve ondalıklı sayı.
  3. (\d{4})[.-/](\d{1,2})[.-/](\d{1,2})
    yyyy.aa.gg biçimindeki tarih bilgisi. $1 = yıl, $2 = ay, $3 = gün
  4. (?#year)(19|20)\d\d[- /.](?#month)(0[1-9]|1[012])[- /.](?#day)(0[1-9]|[12][0-9]|3[01])
    Tarih formatının başka yazımı. Burada “(?#” ilebaşlayan bölüm açıklama yazmak üzere kullanılır ve açıklama metni “)” ile sonlanır.
  5. SELECT 'BT sorguda regexp BT' REGEXP '[[:<:]]BT.*BT[[:>:]]'
    MySQL e özgü yazımla regexp kullanımı.
  6. \d{2}\s?[A-Z]{1,3}\s?\d{2,4}
    Tr plaka tanımına uygun regexp gösterimi (özel plakalar hariç).
Umarım açıklayıcı olmuştur, iyi çalışmalar dilerim..
Print Friendly, PDF & Email
Facebooktwittergoogle_pluslinkedin

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir