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

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