Yazıya dalmadan önce kısa bir terim açıklaması yapmayı yanlış görmüyorum;

Regex (Regular Expressions : Düzenli İfadeler) Nedir?

Bütün programlama dillerinde kullanabileceğiniz çok iyi düşünülmüş bir kural mekanizmasıdır.
İlk baktığınızda "bunun neresi düzenli, tam tersine bu şey oldukça düzensiz görünüyor" diyebilirsiniz. Çünkü gerçekten düzensiz görünen karakter grubudur. Regex (Regular Expressions'un genel olarak kısaltması regex olarak kullanılır) bizim metinlerimiz içerisinden belirlediğimiz kurallara benzeyen metin parçalarını seçmemizi; kullandığınız dile göre değiştirmemizi de sağlayabilir. Mesela bir e-posta'nın doğru olabilirlik kuralları vardır. Sitenizde girilen epostaları bu şekilde doğru veya yanlış formatta olup olmadıklarını kontrol edebilirsiniz.
Bu dökümanda otomatik olarak linkleri nasıl çevireceğimizden bahsedeceğim.

Metinlerde girilen şeylerin link olup olmadıklarını bazı mantıksal kurallara göre bölelim
mesela bir link önce protokolü ile başlar "http://" "ftp://" "ssh://" "file://" vb gibi. Bu başlangıçlar bize girilen şeyin link olduğunu gösterebilir. Aynı şekilde hızlı yazımla birlikte "www." ile başlayan şeyler ".com" ile biten şeyler de bize link olarak seçmemizi sağlayacak kriterler.

PHP'de regex fonksiyonları olarak erege_replace fln kullanabilirsiniz fakat preg_replace daha yetenekli olduğundan preg_replace'e özel bir düzenli ifade kuralı kullanacağız. Şimdi doğrudan düzenli ifade kuralını verip sonra açıklamaya çalışacağım :

http:// ftp:// gibi protokolü ile yazılmış linkler için :
([n ])([a-z]+?)://([a-z0-9-.,?!%*_#:;~\&$@/=+]+)
seçim kurallarını kullanıyoruz.

En baştaki [\n] link eğer satır başında ise seçebilmemizi sağlıyor. Eğer bu ibareyi belirtmezsek yüksek ihtimal sadece satır içindeki linkler dönüşecektir. Bunu belirten kural 1. grup parantez olduğundan \1 ile kullanılabilecek.

Genel bir kural koymadık protokol belirtecimz için çünkü tonlarca farklı protokol var. İstersek ikinci grup parantez'e sadece http sadece ftp gibi belirteçler kullanarak istediğimiz protokole istediğimiz link değişimini uygulayabiliriz. Mesela smb:// için bir windows paylaşım işareti koyabiliriz otomatik çevirdiğimiz link'in yanına, ya da ftp:// için dosya transfer'i anlatan küçük bir ikon. Neyse ikinci grup parantez bizim protokol adımızı ifade ediyor. Bunu \2 ile otomatik link çevirmede kullanacağız.

Statik olarak "://" ibaresi arandıktan sonra 2. grup parantezde tüm linkimizi tarayabilecek kural bulunuyor. Burada dikkat etmemiz gereken şeyler, bir link'te kullanılabilecek özel karakterler olacaktır. Mesela bir linkte # & % = : ; gibi çok karakter vardır. Eğer bunları belirtmezsek. Kullanıcının burada belirtmediğimiz karakterleri içeren bir link girişinde otomatik link çevirilirken o belirtmediğimiz karakterden sonrası link'e dahil edilmeyecektir. Eski sitemde böyleydi :-)
Bu üçüncü grup parantez'le seçilen "www.deneme.com.tr/deneme.php?asd=1&qwe=2$%_*#git" gibi kısım \3 değişkenine atanacaktır.

Sonuç olarak biz metinimizi şu aşağıdaki kod ile otomatk link haline çevirebileceğiz :
$yazi = preg_replace("#([\n ])([a-z]+?)://([a-z0-9\-\.,\?!%\*_\#:;~\\&$@\/=\+]+)#ie",
  "'\\1<a href=\"\\2://\\3\">\\2://\\3</a>'", $yazi);
Bu sitede kullandığım otomatik link dönüşüm fonksiyonu ise şu şekilde :
function linkler( $yazi ) {
    // http seklindekiler
    $yazi = preg_replace("#([\n ])([a-z]+?)://([a-z0-9\-\.,\?!%\*_\#:;~\\&$@\/=\+]+)#ie",
      "'\\1<a href=\"\\2://\\3\" >\\2://\\3</a>'", $yazi);

    // www seklindekiler
    $yazi = preg_replace("#([\n ])www\.([a-z0-9\-]+)\.([a-z0-9\-.\~]+)((?:/[a-z0-9\-\.,\?!%\*_\#:;~\\&$@\/=\+]*)?)#i",
      "\\1<a href=\"http://www.\\2.\\3\\4\">www.\\2.\\3\\4</a>", $yazi);

    // epostalar
    $yazi = preg_replace("#([\n ])([a-z0-9\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)?[\w]+)#i",
      "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>", $yazi);
    
    return($yazi); 
}
Bu fonksiyon ile linklerinizi ve epostalarınızı otomatik dönüştirebilirsiniz.

Hazırlayan : Mehmet Fatih YILDIZ
26 Ocak Perşembe ´06   —   6 Yorum
Bu dökümanda php'deki regular expressions yani düzenli ifadeler hakkında örnek, cevap şeklinde uygulama üzerine bilgiler edineceksiniz. İşte php'nin eregi komutu ile sorulan RegEx cümleciklerine verdiği cevaplar;

1. "^" Metin başlangıcı

eregi("^o","okul");  // DOGRU 
eregi("^o","kul");   // YANLIS

2. "$" Metinin sonu

eregi("ul$","okul");  // DOGRU 
eregi("ul$","oku");   // YANLIS

3. "." Herhangi bir karakter

eregi("^o.ul$","okul");   // DOGRU 
eregi("^.kul$","okul");   // DOGRU 
eregi("^.kul$","9kul");   // DOGRU 
eregi("^oku.$","okul");   // DOGRU 
eregi("^oku.$","okuz");   // DOGRU 
eregi("^oku.$","okuzu");  // YANLIS

4. "k*" k'dan sıfır veya daha fazla

// k'dan 1 tane 
eregi("k*","okul");      // DOGRU 
eregi("^ok*ul","okul");  // DOGRU 

// k'dan 0 tane 
eregi("k*","oul");        // DOGRU 
eregi("^okk*ul","okul");  // DOGRU 
eregi("^ok*ul","oul");    // DOGRU 

// k'dan 2 tane 
eregi("k*","okkul");        // DOGRU 
eregi("k*","koku");         // DOGRU 
eregi("^ok*ul","okkul");    // DOGRU 
eregi("^okk*ul","okkkul");  // DOGRU 

// k'dan cok sayida 
eregi("^ok*ul","okkkul");     // DOGRU 
eregi("^okk*ul","okkkkul");   // DOGRU 
eregi("^ok*ul","okkkkkkul");  // DOGRU

5. "k+" k'dan bir yada daha fazla

// k'dan 1 tane 
eregi("k+","okul");      // DOGRU 
eregi("^ok+ul","okul");  // DOGRU 

// k'dan 0 tane 
eregi("k+","oul");        // YANLIS 
eregi("^okk+ul","okul");  // YANLIS 
eregi("^ok+ul","oul");    // YANLIS 

// k'dan 2 tane 
eregi("k+","okkul");       // DOGRU 
eregi("k+","koku");        // DOGRU 
eregi("^ok+ul","okkul");   // DOGRU 
eregi("okk+ul","okkkul");  // DOGRU 

// k'dan cok sayida 
eregi("^ok+ul","okkkul");    // DOGRU 
eregi("^okk+ul","okkkkul");  // DOGRU 
eregi("ok+ul","okkkkkkul");  // DOGRU

6. "k?" k'dan sıfır yada daha bir tane

eregi("k?","okul");         // DOGRU 
eregi("ok?ul","okul");      // DOGRU 
eregi("ok?ul","okkul");     // YANLIS 
eregi("^ok?ul","okul");     // DOGRU 
eregi("^ok?ul","oul");      // DOGRU 
eregi("^ok?ul","okkkul");   // YANLIS 
eregi("^ko?l","kol");       // DOGRU 
eregi("^ko?l","kl");        // DOGRU 
eregi("^ko?l","koool");     // YANLIS 
eregi("^ko?l","kel");       // YANLIS

7. "ak | kara" ak ya da kara, en az biri

eregi("ak|kara","kara");         // DOGRU 
eregi("^(ak|kara)","kara");      // DOGRU 
eregi("ak|kara","ankara");       // DOGRU 
eregi("^(ak|kara)","ankara");    // YANLIS 
eregi("^(ak|kara)$","ankara");   // YANLIS 
eregi("(ak|kara)$","ankara");    // DOGRU 
eregi("ak|kara","ak");           // DOGRU 
eregi("ak|kara","aek");          // YANLIS 
eregi("ak|kara","akara");        // DOGRU 
eregi("ak|kara","akara");        // DOGRU 
eregi("ak|kara","akkara");       // DOGRU 
eregi("^(ak|kara)$","akkara");   // YANLIS 

eregi("^(ak|kara)(ak|kara)$","akkara");      // DOGRU 
eregi("^(ak|kara)(ak|kara)$","akvekara");    // YANLIS 
eregi("^(ak|kara)ve(ak|kara)$","akvekara");  // DOGRU 
eregi("^(ak|kara)..(ak|kara)$","akvekara");  // DOGRU 
eregi("^(ak|kara).(ak|kara)$","akvekara");   // YANLIS 

eregi("ak|kara","ak_kara");      // DOGRU 
eregi("^(ak|kara)","akk_ara");   // DOGRU 
eregi("ak|kara","ak_k_ara");     // YANLIS

8. "(oku)*" oku'dan sıfır yada daha fazla

eregi("^(oku)*$","oku");   // DOGRU 
eregi("^(oku)*$","okul");  // YANLIS 
eregi("^(oku)","okul");    // DOGRU 

// oku 'dan en başta sıfır tane 
eregi("^(oku)","doku");  // DOGRU 
eregi("(agir)*","cikacaksinagiragirbumerdivenlerden");      // DOGRU 
eregi("(ağır)*","Ağır ağır çıkacaksın bu merdivelerden");   // DOGRU

9. "k{a}" -> k'dan a tane
"k{5}" -> k'dan 5 tane
"k{2,6}" -> k'dan 2,3,4,5 yada 6 tane

eregi("(agir){1}","agiragircikacaksinbumerdivenlerden");      // DOGRU 
eregi("(agir){2}","agiragircikacaksinbumerdivenlerden");      // DOGRU 
eregi("(agir){3}","agiragircikacaksinbumerdivenlerden");      // YANLIS 
eregi("(agir){0,2}","agiragircikacaksinbumerdivenlerden");    // DOGRU 
eregi("(agir){0,2}","agiragircikacaksinbumerdivenlerden");    // DOGRU 
eregi("(agir){0,3}","agiragircikacaksinbumerdivenlerden");    // DOGRU 
eregi("^(agir){0,3}","agiragircikacaksinbumerdivenlerden");   // DOGRU 
eregi("^(agir){0,3}$","agiragircikacaksinbumerdivenlerden");  // YANLIS
Daha önce gösterdiğimiz bazı diğer ifadelerin bu yapıya benzemesi şu şekildedir;
k* = k{0,}
k+ = k{1,}
k? = k{0,1}


10. [a-eKLM] -> a' dan e' ye kadar veya K veya L veya M varsa
[^a-eKLM] -> a' dan e' ye kadar veya K veya L veya M yoksa

eregi("[a-eKLM]","Kalem");       // DOGRU 
eregi("[^a-eKLM]","Kalem");      // YANLIS 
ereg("[a-eKLM]","kAlEm");        // YANLIS 
eregi("[a-eKLM]","kAlEm");       // DOGRU 
ereg("[a-eKLM]","KAlEm");        // DOGRU 
eregi("[a-eKLM]","kalem");       // DOGRU 
eregi("[a-eKLM]","kalemlik");    // DOGRU 
eregi("[^a-eKLM]","kalemlik");   // YANLIS 
eregi("[^a-eKLM]","uzun");       // DOGRU 
eregi("[a-eKLM]","uzun");        // YANLIS 
eregi("^[^a-eKLM]$","uzun");     // YANLIS 
eregi("^[^a-eKLM]+$","uzun");    // DOGRU 
eregi("^[a-eKLM]+$","uzunincebiryoldayim");             // YANLIS 
eregi("^[a-eiKLMnoruyz]+$","uzunincebiryoldayim");      // DOGRU 
eregi("^[a-eiKLMnoruyz]+$","uzun incebiryoldayim");     // YANLIS 
eregi("^[ a-eiKLMnoruyz]+$","uzun incebiryoldayim");    // DOGRU 
eregi("^[_a-eiKLMnoruyz]+$","uzun_ince_bir_yoldayim");  // DOGRU 
eregi("^[^a-eKLM]+$","uzunincebiryoldayim");            // YANLIS

11. [[. .]] karakterleri

\d -> [0-9]
\D -> [^0-9]
\t,\f = \s
\s
\S
\w -> [a-zA-Z0-9] : bütün harfler ve rakamlar
\W -> [^a-zA-Z0-9]


Not : Bu dökümanı hazırlayan kim idi bilmiyorum. Fi tarihinde bilgisayarıma txt olarak geçirmişim. Yazan arkadaştan çok özür diliyorum/teşekkür ediyorum, eğer farkeder ve bildirirse hemen burada adını belirtmek isterim. Zira Hiper-faydalı bir yazı/kaynak olduğunu düşündüğüm için yayınlıyorum.

Popüler Etiketler

javascript ipucu örnek kod less css css3 browsers support social blog html table cache notebook laptop lisans license ruffles wanda facebook oyun php mysql db code firefox spam svn subversion proje pear mdb2 prepare execute injection url phpstorm jetbrains pgsql sql mssql ide editor api opengraph fql optimization rss lifestream parse xml internet player session cookie mootools ios apple itunes mobile app banner ie internet explorer html5 export tool macosx twitter meta share browser screen konsol terminal form button jquery nedir dokuman iOS webkit web app music google wordpress cms zaman coding deployment version control git auth http statistics htaccess www subdomain redirect crossdomain textarea apache route router mod_rewrite applications free ubuntu ntfs fstab server sosyal medya istatistik media graph js windows digital service search bootstrap ajax xmlhttprequest compile seo imza signature mail workspace while startups iphone widget portfolio ipad download linux login doritos kampanya tytz newsletter icon ikon grafik calendar logo assets open source radio switch link plugin ui ux framework osx object box gimp kitap design development mfyz compiler on-the-fly kontrol yapıları if regex howto nasıl style sitemap generator pharma hack app store store in-app purchase purchase verification integration storekit itunes connect date tarih subscription language chart insanlar tebrik optimizasyon kurulum connect query select xhtml icons diff job analyse procedure developer network input wireless database