MyDesign | Kod Arşivi - Anasayfaya Dön   No banner in farm
Anasayfa Araştır Forum Gelişmiş Arama Siteniz İçin En Hit İçerikler RSS İçerik Ekle Scriptler Destekleyenler Kadromuz Reklam İletişim Giriş Sayfası Yap  Sık Kullanılanlara Ekle
Bu Kategorinin En Yeni Makaleleri:


Bu Kategorinin En Çok Okunan Makaleleri:






Arama:
Gelişmiş Arama


No banner in farm



En Çok Görüntülenen Kodlar:


Üye Girişi:
 Üye Ol



Anasayfa > Asp > Makaleler

VBScript Regular Expression Nesnesi

VBScript Regular Expression 5.5 nesnesinin kullanılması konusunda türkçe kaynak

vbscript  regex  regexp  regular  expression  5.5  pattern  match  execute 

Kategori: Asp
Gönderen: threedot
Tarih: 01 Mayıs 2007
Okunma Sayısı: 14533
Puan: 10 / 5 Oy
Puan Ver:
Google Bookmarks  del.icio.us  Digg  Yahoo! MyWeb  Windows Live  Furl
rev 0.1 30.04.2007 03:13

VBScript Regular Expression Nesnesi
    

Önsöz :

Döküman kaynağı olarak 1. ek kaynaklar tercih edilmiştir. Bahsi geçen sınıf COM Browser ile incelenmiş ve sınıf içerisindeki elemanlar tek tek teste tabii tutulmuş ve olası sonuç ve kullanım şekillerine teker teker değinilmiştir. Bu yüzden bu kaynağın kapsadığı konuyu eksiksiz yansıttığını umuyorum. Doküman her zaman geri bildirime ve zaman içerisinde değişikliklere açıktır.

Tuğrul TOPUZ

Giriş :        

Regular Expression, Türkçe ifadesi ile Düzenli İfadeler, betik dillerinde çok kabul görmüş bir yapıdır. Kullanım alanları olarak da kısaca, metin ifadelerin içerisinden metinden daha ufak ifadeleri ayırmak, metnin belli bir kalıba uygunluğunu kontrol etmek, metin üzerinde değişiklikler yapmak olduğunu söyleyebiliriz. Programcılık ile uğraşanların daha önce mutlaka duymuş olduğu Perl dili ise gücünün büyük bir kısmını Regular Expression'dan alır. Bu noktada Regular Expression yapısının dile bağlı olmadığını da görüyoruz. Regular Expression yapısına sahip dillere örnekler vermek gerekirse;

?    Perl
?    Python
?    JavaScript
?    JScript
?    VBScript
?    C#
    
Öneri :
Regular Expression'a kısaca "Regex" veya "RegExp" adı da verilir.
    
VBScript üzerinde kullandığımız Regex nesnesi ?VBScript.dll? ActiveX kütüphanesinde bulunur. Biz nesneyi devraldığımızda dolaylı olarak bu ActiveX kütüphanesi üzerinden yordamlar yürütülür. Şimdi de Regex nesnesini devralmayı öğrenelim;

    ?ornek_1.vbs
    '-----
    Dim oRegEx
    Set oRegEx = New RegExp
    '-----
    
    aynı şekilde değişik ortamlar içersinde de kullanılabilir;
    
    uyarı :
    VBScript browser dili olarak yalnızca Internet Explorer üzerinde kullanılabilir.
    
<!--ornek_1.htm-->
    <html>
        <head>
            <title>VBScript Regex</title>
        </head>
        <script language="VBScript" type="text/vbscript">
        <!--
        Dim oRegEx
        Set oRegEx = New RegExp
        '-->
        </script>
        <body>
        </body>
    </html>
    
    <!--ornek_1.asp-->
    <%@
    Language=VBScript
    %>
    <%
    Dim oRegEx
    Set oRegEx = New RegExp
    %>

Gördüğünüz gibi RegExp nesnesini VBScript nesnesinin kullanıldığı ortamların hepsinde kullanabiliyoruz. Fakat biz örneklerimizi VBS dosyaları üzerinden devam ettireceğiz. Çünkü VBS dosyaları kodlama ve uygulama açısında çok kolaylık sağladığı için bu formu tercih edeceğiz. Dileğinize göre VBS formunu diğer formlara uygun hale dönüştürebilirsiniz. Şimdi nesneyi devralmayı öğrendiğimize göre daha anlaşılır bir örnek yapalım;

    ?ornek_2.vbs
    '-----
    Const sCumle = "oyuncu Tuğrul, programcı Tuğrul"
    
    Dim oRegEx
    Set oRegEx = New RegExp
    
    oRegEx.Pattern = "Tuğrul"
    
    Dim oMatch,sSonuc
    For Each oMatch In oRegEx.Execute(sCumle)
        sMatch = _
        "-----" & VbCrLf & _
        "Bulunan değer: " & oMatch.Value & VbCrLf & _
        "Değerin uzunluğu: " & oMatch.Length & VbCrLf & _
        "Başlangıç sırası: " & oMatch.FirstIndex & VbCrLf & _
        "-----"
        WScript.Echo(sMatch)
    Next

    
    Set oRegEx = Nothing
    '-----

Bu örnek ASCII formda VBS uzantısı ile kaydederek direkt çalışabilir hale gelmektedir. Dosya uzantısı Windows un yapılandırmasından ötürü yorumlayıcı program ile ilişkilidir. Dosyayı kaydetmişseniz direkt olarak çift tıklama ile çalıştırabilirsiniz. Çıktısı şu şekilde olacaktır:

    çıktı:
    -----
    Bulunan değer: Tuğrul
    Değerin uzunluğu: 6
    Başlangıç sırası: 7
    -----
    
Sonucu açıklığa kavuşturmak gerekirse "Bulunan değer" adlı kısım oRegEx.Pattern ile belirlediğimiz kalıp ile, içinde arama yaptığımız metin içerisinde doğrudan uyuşan kısımların, metin içerisinden ayrılıp bizim kullanımımıza sunulmuştur. Şimdi kafanıza şöyle bir soru takılacaktır. Kalıp ifade ile size sunulan değerin aynı olduğunu, bunun için bu tarz bir aracı ne amaç için kullanacağınız aklınızda soru işareti olacaktır. Kalıp ifadeler çoğu zaman net olarak tanımlanmazlar. Örnek olarak ".+@\..+" da kalıp ifadedir. Belirttiğimiz metinden mail adresi türündeki değerleri bize sunar. "Değerin uzunluğu" adlı kısım da "Bulunan değer" in karakter sayısını verir. Yani karakter sayısına ihtiyaç duyduğunuz zamanlarda sizi Len() fonksiyonunu kullanmak zorunda bırakmaz. İfade "Başlangıç sırası" ise "Bulunan değer" in ilk karakterinin metinin içerisinde kaçıncı karaktere denk geldiğini eder.

Şimdi önceden değinmediğimiz bir şeyden bahsetmenin vakti geldi. Aslında metin içerisinde kalıp ile uyuşan iki adet kelime mevcut. Fakat buna rağmen döngü bize 1 adet sonuç verdi. Bunun nedeni, nesneyi devraldığımızda kalıbın yalnızca bir ifade için geçerli olmasıdır. Bunu değiştirmek bizim elimizdedir. İlk devraldığımızda oRegEx.Global özelliği False değerine sahiptir. Şimdi sizi kandırdığımı nerden bileceksiniz .O zaman ispata gelelim;

    ?ornek_3.vbs
    '-----
    Dim oRegEx
    Set oRegEx = New RegExp
    
    WScript.Echo oRegEx.Global
    
    Set oRegEx = Nothing
    '-----
    
    çıktı:
    0
    
    Veya,
    
    çıktı:
    False
    
Evet, gördüğünüz gibi ben haklı çıktım. Şimdi bu eklemeyi bir önceki programa ekleyip tekrar sonucunu gözlemleyelim;

?ornek_4.vbs
    '-----
    Const sCumle = "oyuncu Tuğrul, programcı Tuğrul"

    Dim oRegEx
    Set oRegEx = New RegExp
    
    oRegEx.Pattern = "Tuğrul"
    oRegEx.Global = True
    
    Dim oMatch,sSonuc
    For Each oMatch In oRegEx.Execute(sCumle)
        sMatch = _
        "-----" & VbCrLf & _
        "Bulunan değer: " & oMatch.Value & VbCrLf & _
        "Değerin uzunluğu: " & oMatch.Length & VbCrLf & _
        "Başlangıç sırası: " & oMatch.FirstIndex & VbCrLf & _
        "-----"
        WScript.Echo(sMatch)
    Next
    
    
    Set oRegEx = Nothing
    '-----
    
    Çıktı:
    -----
    Bulunan değer: Tuğrul
    Değerin uzunluğu: 6
    Başlangıç sırası: 7
    -----
    -----
    Bulunan değer: Tuğrul
    Değerin uzunluğu: 6
    Başlangıç sırası: 25
    -----
    
Şimdi de zaman zaman ihtiyaç duyup da UCase() ve LCase() gibi fonksiyonları kullanarak ilkel yollardan çözmenin aklınıza geleceği bir özellikten daha bahsedeceğim. Bu özellik ise oRegEx.IgnoreCase özelliği. Bunun başlangıç değeri False dır. Görevi ise kalıp ile metini büyük küçük harf benzeşmesini gözetmeksizin yapmasıdır. Buna örnek verelim;

    ?ornek_5.vbs
    '-----
    Const sCumle = "oyuncu TuğruL, programcı tUĞRul"
    
    Dim oRegEx
    Set oRegEx = New RegExp
    
    oRegEx.Pattern = "tuğrul"
    oRegEx.Global = True
    oRegEx.IgnoreCase = True
    
    Dim oMatch,sSonuc
    For Each oMatch In oRegEx.Execute(sCumle)
        sMatch = _
        "-----" & VbCrLf & _
        "Bulunan değer: " & oMatch.Value & VbCrLf & _
        "Değerin uzunluğu: " & oMatch.Length & VbCrLf & _
        "Başlangıç sırası: " & oMatch.FirstIndex & VbCrLf & _
        "-----"
        WScript.Echo(sMatch)
    Next
    
    
    Set oRegEx = Nothing
    '-----
    
    çıktı:
    -----
    Bulunan değer: TuğruL
    Değerin uzunluğu: 6
    Başlangıç sırası: 7
    -----
    -----
    Bulunan değer: tUĞRul
    Değerin uzunluğu: 6
    Başlangıç sırası: 25
    -----
    
    Dikkat çekeceği gibi metin ifadesinin içerisindeki ?Tuğrul? kelimesinde yerli yersiz büyük küçük harf dönüşümü yaptım. Örnek ilk anda yukarıdaki gibi sonuç verecektir. Bahsettiğimiz ifadede değişiklik yaparak sonuçtaki değişikliği görebilirsiniz.

Şimdi de baştan beri kullandığımız, fakat daha ne olduğundan bahsetmediğimiz bir şeyden bahsedeceğiz. Belirteceğimiz özellik oRegEx.Pattern. Bu özellik üzerinde işlem yapacağımız metin içerisinden ulaşmak istediğimiz kıstaslara uygun sonuçlar elde etmemizi sağlayan kalıbı tanımladığımız kısım. ?String? türünde değer alır ve geri döndürür. Her zaman baştan beri kullandığımız gibi net ifadeler kullanılmadığından daha önce bahsetmiştik. Şimdi de daha önce soyut olarak bahsettiğimiz mail örneğini soyutlaştıralım;

Kullanıcılar çoğu zaman hatalar yaparlar. Yanlış karakterler kullanırlar, yanlışlıkla boşluk ve yatay tab karakterleri kullanırlar, kimi zaman da bazı karakterleri unuturlar. Şimdi bu örnek için ASP ve HTML?i kullanabileceğimiz kanısındayım.

    <!--ornek_2.htm-->
    <html>
        <head>
            <title>e-mail listesi</title>
            <script language="VBScript" type="text/vbscript">
            <!--
            Sub FormKontrol()
                Dim oRegEx
                Set oRegEx = New RegExp
                
                oRegEx.Pattern = "^.+@.+\..+$"
                oRegEx.Global = False
                oRegEx.IgnoreCase = False
                
                Dim oForm
                Set oForm = document.forms(0)
                If Not oRegEx.Test(oForm.item(0).value) Then
                    window.event.returnValue = False
                    Dim oUyari
                    Set oUyari=document.getElementById("uyari")
                    oUyari.innerHTML=_
                    "* Girilen adres geçersiz."
                End If
            End Sub
            '-->
            </script>
        </head>
        <body>
            <form
                action="ornek_2.asp"
                method="POST"
                onsubmit="FormKontrol()">
                e-mail listemize abone olmak istermisiniz?<br>
                <input
                    type="text"
                    name="f_email">
                <div
                    id="uyari"
                    style="color:#FF0000">
                </div><br>
                <input
                    type="submit"
                    name="uyeol"
                    value="Üye Ol">
            </form>
        </body>
    </html>
    
    <!--ornek_2.asp-->
    <%@
    Language=VBScript
    %>
    <%
    If UCase(Request.ServerVariables("REQUEST_METHOD")) = "GET" Then
    Response.End()
    
    Dim oRegEx
    Set oRegEx = New RegExp
    
    oRegEx.Pattern = "^.+@.+\..+$"
    oRegEx.Global = False
    oRegEx.IgnoreCase = True
    
    If oRegEx.Test(Request.Form("f_email")) Then
    Response.Write("e-mail listemize abone olduğunuz için teşekkür
    ederiz.")
    Else
        Response.Write("hata: beklenmeyen form verisi")
    End If
    %>
    
Bu yaptığımız örnekte iki konuyu esas aldık.
    
1.    Kullanıcının hata yaparak, yanlış veri göndermesi.
2.    Kullanıcının kasıtlı amaçlar güderek yanlış veri göndermesi.
    
İlk olarak HTML'de yaptığımız kontrol mekanizması WEB programlama konusunda deneyimi olmayan, kişinin yanlış veri girdiği anda kişiyi uyararak doğru veri girmesi konusunda yönlendiriyor. ASP içerisindeki kontrol mekanizması ise normal şartlarda HTML'den gelebilecek teorik veriye göre faal(işler) gözükmüyor. Fakat zararlı bir kullanıcının, HTML temelli korumayı görüp balık gibi atladığını ve buna bağlı olarak kendi HTML kodunu oluşturup bizim ASP dosyamıza bununla kontrolsüz veri gönderme yeteneğine sahip olduğunu düşünürsek, böyle bir kontrolün ne kadar gerekli olduğunun önemini anlarız.

Şimdi ise bize kurulumdan sonra en çok fayda sağlayacak 3 adet fonksiyonu inceleyeceğiz;
    
?    Test
?    Replace
?    Execute
    

Test Fonksiyonu

Biraz önce açıklamadan, e-mail kontrol örneğinde direkt olarak kullandığımız Test fonksiyonunun görevini ve nasıl kullanıldığını kısa bir tanımdan sonra inceleyeceğiz. Test fonksiyonumuz basitçe, parametre olarak gönderdiğimiz metin ifadenin kalıba uyup uymadığını kontrol eder ve "Boolean" türünde bize yanıt döndürür. Ufak bir örnek;

    ?ornek_6.vbs
    '-----
    Dim oRegEx
    Set oRegEx = New RegExp
    
    oRegEx.Pattern = "^a"
    oRegEx.Global = True
    oRegEx.IgnoreCase = True
    
    Dim sBenimAdim
    sBenimAdim = InputBox("Lütfen adınızı giriniz:","VBScript
Regex","Şevket")
    
    Dim sSonuc
    sSonuc = "Adınız ""A"" harfi ile "
    
    If oRegEx.Test(sBenimAdim) Then
        sSonuc = sSonuc & "başlıyor."
    Else
        sSonuc = sSonuc & "başlamıyor."
    End If
    
    WScript.Echo(sSonuc)
    
    Set oRegEx = Nothing
    '-----
    Eğer varsayılan değer ile kodu çalıştırdığınızda sonuç aşağıdaki gibi olacaktır.

    çıktı:
    Adınız ?A? harfi ile başlamıyor.

Replace Fonksiyonu

Replace fonksiyonu görünüş olarak VBScript içerisindeki Replace fonksiyonunu andırmaktadır. Fakat bunda gözle görünmeyecek bir fark vardır. Bu farka biz "swap each pairs" adını veriyoruz. Kalıp ifade hazırlanırken kalıp ifade hazırlama karakterlerinde ( ve ) karakterleri ile oluşturulan yapılara pair adı verilir. Sonuç ifade içerisinden parça alıp taşıma gibi işlemlerde oldukça işimize yaramaktadır. Şimdi HTML kodunu basitçe BBCode'ye dönüştüren ufak bir örnek yapalım.

    

?ornek_7.vbs
    '-----
    Dim oRegEx
    Set oRegEx = New RegExp
    
    oRegEx.Pattern = "<(.+)>([^<>]+)</(.+)>"
    oRegEx.Global = True
    oRegEx.IgnoreCase = True
    
    Dim sGelenVeri
    sGelenVeri = InputBox( _
    "Dönüştürülecek HTML kodunu giriniz:", _
    "VBScript Regex", _
    "<a href=""tihaha.htm"">tihaha anasayfa</a>")
    
    Dim sSonuc
    sSonuc = oRegEx.Replace(sGelenVeri,"[$1]$2[/$3]")
    
    WScript.Echo(sSonuc)
    
    Set oRegEx = Nothing
    '-----
    
    Varsayılan değer ile kodu çalıştırdığınızda sonuç aşağıdaki gibi olacaktır.

    çıktı:
    [a href=?tihaha.htm?]tihaha anasayfa[/a]

Execute Fonksiyonu

Bu fonksiyonu da ilk örneklerimizde kullanmıştık. Bana göre bu sınıfın en can alıcı fonksiyonu budur. Bu fonksiyon "Sting", "Integer" veya "Boolean" gibi saf bir değer döndürmemektedir. Fonksiyonun döndürdüğü değer türü "Object" dir. Yani başla bir sınıfın işaretçisidir. Sınıfı koleksiyon olarak geri döndürür. Koleksiyon dediğimizde aklımıza günlük hayattan örnekler gelebilir. Aslında bu örnekler ile doğrudan ilişkilidir. Koleksiyon dediğimizde aklımıza aynı cins ortak özelliklere sahip, belirli kıstaslara göre değişen nitelikler örneğin, bozuk para koleksiyonu, koleksiyondaki her para, anıldığı adı ile özleşen özelliklere sahiptir. Örneğin birisi bakır, birisi bronz birisi altın madeninden üretilmiş, Maddi değerleri farklı olan şeylerdir. Bu kadar teoriden sonra işi pratiğe dökelim;

    ?ornek_8.vbs
    '-----
    Dim oRegEx
    Set oRegEx = New RegExp
    
    oRegEx.Pattern = "<(.+)>([^<>]+)</(.+)>"
    oRegEx.Global = True
    oRegEx.IgnoreCase = True
    
    Dim sGelenVeri
    sGelenVeri = InputBox( _
    "Dönüştürülecek HTML kodunu giriniz:", _
    "VBScript Regex", _
    "<a href=""tihaha.htm"">tihaha anasayfa</a>")
    
    Dim oMatch,oSubMatch,sSonuc
    For Each oMatch In oRegEx.Execute(sGelenVeri)
        sSonuc = _
        "-----" & VbCrLf & _
        "Bulunan değer: " & oMatch.Value & VbCrLf & _
        "Değerin uzunluğu: " & oMatch.Length & VbCrLf & _
        "Başlangıç sırası: " & oMatch.FirstIndex & VbCrLf & VbCrLf & _
        "Alt Değerler: " & VbCrLf
        For Each oSubMatch In oMatch.SubMatches
            sSonuc = sSonuc & "    + " & oSubMatch & VbCrLf
        Next
        sSonuc = sSonuc & "-----"
    Next
    
    WScript.Echo sSonuc
    
    Set oRegEx = Nothing
    '-----

Varsayılan değer parametre olarak gönderildiğinde sonuç şekildeki gibi olacaktır.
    
    çıktı:
    -----
    Bulunan değer: <a href="tihaha.htm">tihaha anasayfa</a>
    Değerin uzunluğu: 40
    Başlangıç sırası: 0


    Alt Değerler:
                + a href="tihaha.htm"
                + tihaha anasayfa
                + a
-----
    

Daha önceden Match nesnesinin özelliklerine değindiğimiz için bunun üzerinde fazla durmadık ve bir önceki örnek üzerine ekleme yaparak SubMatches koleksiyonuna değineceğiz. Replace fonksiyonunda can alıcı nokta olarak gösterdiğimiz "swap each pairs" yine burada da canlar yakıyor. Örneğimizde kullandığımız SubMatches, Match nesnesi içerisinde bulunur ve kalıba oturan değerler arasındaki değişikliğe göre fark gösterir. Tam manası ile yaptığı iş, kalıp kodu içerisindeki pair ifadelerine, metin ifadelerinin oturan kısımlarını toplar ve ihtiyacımız olanını almamızı sağlar. Bu koleksiyon "Object" türünde değildir. "Variant" türünde saf türde bir veri döndürür. Visual Basic veya VBScript ile uğraşan kişiler bu veri türünün bu dillere özgü olduğunu bilirler. Özelliği ise içerisinde zaman içerisinde yeniden tanımlanmadan değişik veriler tutabilmektir. Tabiî ki böyle olması, bellek ile arasında derin tartışmalar yapmasına neden olur.

?    Regular Expression, 5.5 sürümü itibari ile eksiksiz olarak anlatılmış ve örneklendirilmiştir.
?    Bazı hakları yazar threedot a.k.a. Tuğrul TOPUZ adına saklıdır.
    
    Referans Kaynak :
?    Microsoft® Visual Basic® Scripting Edition Language Reference

    threedot a.k.a. Tuğrul TOPUZ
    threedot@hotmail.it

VBScript Regular Expression Nesnesi için yazılan yorumlar

Henüz yorum eklenmedi.

Yorum ekleyin

Bu sayfaya link verin:
Anasayfa > Asp > Makaleler > VBScript Regular Expression Nesnesi
Kategoriler:


Forum:



Bağlantılar:


Murat Yavuz | Site Haritası | Gizlilik Bildirimi | 54.166.61.50 | 0,14 Saniye
© Copyright 2004-2017 MyDesign | Kod Arşivi. Tüm Hakları Saklıdır.
MyDesign | Kod Arşivi, en iyi görünüm için, 1024x768 ve üzeri çözünürlük tavsiye eder.