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

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