chat eczaonline.com yazılım uzmanı gaziantep web tasarım

Ders: Regex İle Yazı Stilleri Oluşturma

L4roXyL

Profesyonel
Katılım
16 Eki 2011
Mesajlar
124
Beğeniler
2
#1
Yazan: L4roXyL - Hasan AYDENİZ


Bildiğiniz üzere bir çoğu script-de, kalın/ince yazı, renkli yazı(bir harf belirtilen renk, diğer harf diğer belirttiğiniz renk) ve büyük/küçük yazım şekli şeklinde kod-lar mevcut.
Bu tarz kodlar/işlevler genellike uzun, bol loop-lu kodlar ile yazılmaktadır ve olduğunca uzun olmaktadır(bunu en yeni çıkan scriptleri dahi gözlemleyerek söylüyorum)
-
Erdem arkadaşımız "bunu regex(regular expression) ile yapabilirmiyiz?" dediğinde, kalın/ince yazı için aklımda hemen bir mantık oluştu. Çünki daha önceden-de yazdığımı hatırlıyorum. Lâkin renkli ve büyük/küçük yazı şekli için duraksadım. Çünki kalın/ince yazının mantığı basittir; her harf arasına CTRL+B[old]($chr(2)) koymanız yeterli olur. Ama renkli yazı ve büyük/küçük yazı şekli için aynı şey geçerli değil tabiki. Farklı kullanımlar mevcut olduğu için farklı bir mantık geliştirmeniz gerekiyor. Her zaman dediğim gibi mIRC Scripting-de en iyi, en işlevsel, en hızlı ve en kısa kodu yazabilmek mantığınıza bağlıdır. Bilginizde önemlidir tabiki. Fazla uzatmadan mantıkları açıklayayım size.

-

Kalın/ince yazı mantığı yukarıdada dediğim gibi basittir.
Ben regex kullandığım için, regex-daki mantığını açıklayacağım. Zaten diğer yollarla yine yukarıda dediğim gibi bir ton gereksiz external loop kullanmanız lazım. Buna gerek duymuyorum gerek olduğunuda bu saatten sonra zannetmiyorum. :)
Regex-da aranılan verideki eşleşmeleri yakalamak için "(veri)" kullandığımızı biliyorsunuz.

-

Örnekler:

Ö1: //echo -: $regex(r,deneme,e) => 1
Yakalama: //echo -: $regml(r,0) => 0
Açıklaması: Eşleşme var, yakalama işlevi yok. () kullanmadık.
-
Ö2: //echo -: $regex(r,deneme,(e)) => 1
Yakalama: //echo -: $regml(r,0) => 1
Açıklaması: Eşleşme ve yakalama işlevi var. Lâkin sadece d harfinden sonra gelen "e" harfini yakalar. Bu yüzden sonuç 1 olarak döner ve $regml(r,1) "e" olarak döner. Bunun sebebi /g/ anahtarını kullanmadık.
-
Ö3: //echo -: $regex(r,deneme,/(e)/g) => 3
Yakalama: //echo -: $regml(r,0) => 3
Açıklaması: Eşleşme ve yakalama işlevi var. Deneme text-i içerisindeki tüm "e" harfleri başarıyla yakalandı.
Eşleşmeleri görmek için: //var %1 = 1 | while ($regml(r,%1)) { echo -: %1 - $v1 | inc %1 }

Sanırım buraya kadar anlaşılmayan birşey yok.
Şimdi gelelim, kalın/ince yazı şeklini nasıl yazacağız?
Söyleki;

mIRC Scripting-de $regsubex([name], text, re, subtext) tanımını bilirsiniz. Yani regex-i bilen herkez bu tanımında ne işe yaradığını az/çok bilir.
Kısaca text içerisindeki belirtilen veriyi, yine belirtilen şekilde değiştirmenizi sağlıyor. Aklınıza $replace(x) vs. gelmesin bu çok daha fazla gelişmiş şeklidir. :) Neyse daha fazla uzatmadan açıklamak istiyorum.
-
Kalın/ince yazmamanın yolu regsubex ile sadece bu kadar. .)
Kod: $regsubex(deneme,$1-,/(.)/g,$+($chr(2),\1))
-
Açıklaması: /(.)/g bu kısımda "." herhangi bir karakter demektir. Burada yaptığımız işlev veri içerisindeki her karakteri yakalıyoruz. Yani text içerisindeki tüm karakterler $regml(deneme,[N]) şeklinde görülebilir. Buradaki "deneme" regex-e verdiğimz isimdir, karışma olmasın diye belirttim. "\1" kısmı ise yakalan veri olarak döner. Yani kısacası text içerisindeki tüm verileri yakalıyor ve onları $chr(2)(bold karakteri) ile re-text ediyoruz.
Görmek için: //var %1 = 1 | while ($regml(deneme,%1)) { echo -: $v1 | inc %1 }

Sanırım buraya kadarda anlaşılmayan birşey yok.

-

Şimdi gelelim; büyük/küçük ve renkli/renksiz yazma olayına.
-
Bu olayda yukarıdaki gibi, lâkin kullanacağımız mantık biraz daha farklı olacak. Yukarıyı okuduysanız bu bölümden sonra ne dediğimi gayet iyi anlayacaksınızdır diyerek konuya giriyorum.
-
Bildiğiniz gibi IF sorgusunda; "//" operatörü mevcut. Bu operatör, belirtilen saysının; diğer belirtilen sayının katları olduğunda eşleşme gerçekleştirir.
Örneğin: //if (2 // 4) echo -: $v1
Gibi. Burada belirtilen "4" rakamı belirtilen "2" sayısının kat sayılarından birisidir. //if (2 // 3) echo -: $v1 yaptığınızda pozitif sonuç dönmez. Çünki "3" rakamı "2" rakamının kat sayısı değildir. Aynı şekilde bir diğer operatör olan "\\" ise aynı işlevin tam tersini yapar. Yani yazılan ilk sayı, yazılan ikinci sayının kat sayısı ise sonuç pozitif dönecektir.
Örneğin: //if (4 \\ 2) echo -: $v1
Gibi.
-
Yani şimdi diyebilirsiniz; "bu adam neden bunları anlatıyor bize?" bende size cevap olarak; mIRC Scripting bir mantık işidir. Yapabilecekleriniz mantık + bilgi ile sınırlıdır ve her ikisinin seviyesine göre kodlar yazabilirsiniz. Mantık + bilgi ne kadar iyi ise, sizde o kadar iyi bir coder-sınız demektir.
-
Diyelimki şöyle bir istek yapılıyor(ki yukarıda dediğim gibi script-lerin çoğunda bu vazgeçilmez bir özelliktir); yazdığım yazının harflerinin birisi kırmızı, diğeri siyah olsun?

Mantık olarak ne yapacağız? Yukarıdaki örneklerde yaptığımız gibi yine text içerisindeki tüm karakterleri (yakalayacağız) ve son olarak re-text edeceğiz.
AMA; bu işlevi tam olarak yukarıdaki gibi yaparsak, text-in tamamı ilk belirlediğimiz renk ile görülecektir. Peki biz bu konumda ne yapabiliriz? Nasıl yapacağız? Şu konumda loop(while vs.)lara girmeden işin içinden çıkılamaz gibi geliyor.
Şöyle birşey yapsak? Regex-da "\n" yakalanan verinin numarasını veriyordu biliyorsunuz. "\1" veya "\t" ise yakalanan verinin kendisini veriyordu.
-
Daha iyi anlamak için verdiğim iki küçük örneğe bakınız:

Ö1: //echo -: $regsubex(deneme,/(e)/g,\n)
Sonuç: d1n2m3 (yakalanan veriler yakalam sırasına göre numaralandırıldı)
-
Ö2: //echo -: $regsubex(deneme,/(e)/g,\1)
Sonuç: deneme (yakalanan veriler(tüm e harfleri oluyor bunlar) aynı biçimde gösterildi.

Buraya kadar anlaşılmayan birşey yok sanırım.
En son yapmamız gereken küçük bir IF sorgusu. Diyeceğizki; yakalanan veri numarası "2" sayısının katları ise, belirtilen rengi re-text edeceğiz. Eğer değilse, normal bir şekilde re-text edeceğiz. Yani kısacası şu şekilde olacak; "d1n2[burayı re-text et]m3" şeklinde. Ben artık daha fazla uzatmadan size yazdığım kodu veriyorum.
-
Kod: $regsubex($1-,/(.)/g,$iif(2 \\ \n,$+($chr(3),4,\1,$chr(3),1),\1))
-
Demekki neymiş?
Bu veya buna benzer(büyük/küçük harf mesela) bir kod için 3/5 tane loop kullanmaya ve en az 25 satır kod yazmaya gerek yokmuş.
Ve bir süpriz daha, aynı mantığı kullanarak harflerin büyük/küçük olmasınıda sağlayabiliyoruz.
-
Kod: $regsubex($1-,/(.)/g,$iif(2 \\ \n,$upper(\1),$lower(\1)))
-

Son olarak hepsini bir arada toparlayarak, bir kod yazıyorum ve ders niteliğinde olan makalemizi sonlandırıyorum.

Kod:
alias _t {
  if ($isid && $regex(+t,$1,^(caps|color|bold)$)) {
    var %_t = $regml(+t,1),%_r = return,%_2 = $iif($2,$v1),%_3 = $iif($3,$v1)
    if ($(,%_t) = caps) %_r $regsubex($$2-,/(.)/g,$iif(2 \\ \n,$upper(\1),$lower(\1)))
    if ($(,%_t) = bold) %_r $regsubex($$2-,/(.)/g,$+($chr(2),\1))
    if ($(,%_t) = color) %_r $regsubex($$4-,/(.)/g,$iif(2 \\ \n,$+($chr(3),%_2,\1,$chr(3),%_3),\1))
  }
}
-

Kullanım: $_t(bold|caps|color,text)
Kullanım(color hakkında): 2 renk belirlemelisiniz. Bu belirlediğiniz 2 renk sayesinde re-text olacaktır. Örneğin: $_t(color,4,2,deneme)
Açıklama: 4 ilk rengin, 2 ise ikinci rengin kodudur. Tabiki siz bunları değiştirip istediğiniz renk yapabilirsiniz. Bu sadece bir örnektir. Renk kodlarını görmek/öğrenmek için; CTRL+K yapınız.
-
Örnek kullanımlar:
-
Büyük/küçük yazı: //echo -: $_t(caps,Deneme yapıyoruz.)
Sonuç: DeNeMe yApıyOrUz.
-
Kalın/ince yazı: //echo -: $_t(bold,Deneme yapıyoruz.)
Sonuç: Deneme yapıyoruz.
-
Renkli yazı: //echo -: $_t(color,4,2,Deneme yapıyoruz.)
Sonuç: Deneme yapıyoruz.

-

Makalemiz sona ermiştir.
İleriki zamanlarda regex ile kısa, hızlı ve işlevsel kod yazmanın yollarına sizlere vaktim oldukça sunmaya devam edeceğim.
-
Kolay gelsin.
 

Bu konuyu okuyanlar (Üyeler: 1, Misafirler: 0)

Türkiye’nin ilk webmaster forum sitesi iyinet.com'da forum üyeleri tarafından yapılan tüm paylaşımlardan; Türk Ceza Kanunu’nun 20. Maddesinin, 5651 Sayılı Kanununun 4. maddesinin 2. fıkrasına göre, paylaşım yapan üyeler sorumludur. iyinet.com sayfalarında yer alan yazı, görsel ve linklerle ilgili hukuki şikayetleriniz için Buradan iletişime geçmeniz durumunda, ilgili kanunlar ve yönetmelikler çerçevesinde en geç 7 gün içerisinde iyinet yönetimince tarafınıza dönüş sağlanacaktır. Betcup Artemisbet Forum canlı bahis
Üst