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

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