Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

Bir Regex sorusu

Konu, 'Yazılım Geliştirme' kısmında ee++ tarafından paylaşıldı.

  1. ee++

    ee++ Daimi Üye

    Kayıt:
    25 Temmuz 2002
    Mesajlar:
    1,122
    Beğenilen Mesajlar:
    0
    Şehir:
    Ankara
    Selamlar,

    HTML kaynak kodunun bulundugu bir dizgiden
    <a href="ABC">XYZ</a>
    bicimindeki ifadeleri tanıyacak düzgün ifade (regex) nasildir?

    Tesekkurler.
     
  2. mkarabulut

    mkarabulut Misafir

    Aslında yukarıdaki oldukça basit bir link,linkler doğu zaman daha karışık olabilirler. Aşağıda php ile yazdığım verilen metnin içindeki tüm köprüleri alıp bi diziye atan bi kod parçası var,oldukça basit kurallar dahilinde yapıyor bu işlemi,karmaşık köprüler için daha da geliştirilmelidir,ama fikir vermesi açısından yazıyorum

    $foundlinks=array();
    while (eregi("<a[[:space:]]+href\=\"([a-z0-9./&#:?_%=-]+)\"[[:space:]]*>([a-z0-9[:space:]iİüÜçÇöÖğĞşŞ]+)(</a>)",$str,$regs)){
    $str=str_replace($regs[0],"",$str);
    $foundlinks[]=$regs[1];
    }


    Ben php.net/index.php için uyguladım, güzel sonuçlar verdi...

    (Yalnız : (</a> ) ifadesinde > işaretinden sonra boşluk karakteri yok,forum kendisi ekliyor,uygularken onu kaldırınız..)
     
  3. ee++

    ee++ Daimi Üye

    Kayıt:
    25 Temmuz 2002
    Mesajlar:
    1,122
    Beğenilen Mesajlar:
    0
    Şehir:
    Ankara
    Teşekkürler Mustafa, incelicem. Ben şöyle basit bi şey yapmıştım şimdilik "<a href.*?>". Eğer yeni yaklaşımlarınız olursa alayım.

    Kolay gelsin.
     
  4. istemci

    istemci Yeni Üye

    Kayıt:
    22 Kasım 2002
    Mesajlar:
    3
    Beğenilen Mesajlar:
    0
    Selamlar.
    Konu güzel. Derim ki, burada gelişmiş bir kod yazalım ve ihtiyacı olan kişilere güzel bir kaynak oluştursun.

    Öncelikle "a" tagının yapısını incelemek lazım. Bakalım elimizde neler var.

    Genellikle en basit şekliyle "a" tagının kullanımı şu şekildedir;
    <a href="index.html">Ana sayfa</a>

    Fakat "a" tagının "href"'ten başka parametreleri de vardır. Örneğin; class, id, name, onclick ...
    Ve bu parametreler herhangi bir sıralamada olabilir. Örneğin;
    <a id="test" class="q" href="index.html">Ana sayfa</a>

    Bu yazımdaki bütün boşluklar beyaz boşluk olabilir. Yani, tab, return, enter, boşluk ...

    Başka bir problem parametrelere değer atarken çift tırnak kullanma zorunluluğunun olmamasıdır.
    <a id=test class=q href=index.html>Ana sayfa</a>

    Daha bunlar gibi ufak tefek zorluklar mevcut.

    Bu arada hemen şunu da söylemek lazım. PHP'de regexp yazarken kesinlikle ve kesinlikle ereg fonksiyonları yerine preg fonksiyonları kullanılmalıdır. Daha önceleri yazmış olduğum oldukça karmaşık bir regexp'te, ereg fonksiyonları işlemi 2 dakika gibi abartı bir sürede yaparken, preg fonksiyonları saniyenin çok altında bir sürede işlemi tamamladı.

    Koda gelelim. Yukarıda bahsettiğim kurallar çerçevesinde bir regexp yazmaya çalıştım. Fakat çift tırnak olmayan href parametreleri için tek bir regexp tanımlamayı şimdilik başaramadım.

    PHP:
    preg_match_all('/<a.*href="([^"]*)".*>(.*)<\/a>/Usi'$html$found);
    Yukarıdaki kodda $html değişkeni işlem yapılacak olan sayfanın kaynak kodu. Bulunan ifadeler $found değişkenine atılıyor.

    Örneğin sayfada bulunan ilk linkin değerlerini almak için $found değişkenini şu şekilde kullanıyoruz.

    PHP:
    echo 'Link: '.$found[1][0].' Text: '.$found[2][0]
    Çift tırnak problemini de aşarsak (bir satır daha kod yazmadan) oldukça kullanışlı bir kod olacak. Görüşlerinizi bekliyorum.
    Sevgilerimle...
     
  5. Düzgün

    Düzgün Üye

    Kayıt:
    29 Temmuz 2002
    Mesajlar:
    206
    Beğenilen Mesajlar:
    0
    merhaba selam, aynı olayı yapan ifadeyi perl ile yazmayı denedim.
    PHP:
    $textq~
    <
    a href="index1.html">Ana sayfa</a>
    <
    a href="index2.html>Ana sayfa</a>
    <a id="
    test" class="q" href="index3.html">Ana sayfa</a>
    <a id=test class=q href=index4.html>Ana sayfa</a>
    <a href=index5.html id=test class=q>Ana sayfa</a>
    <a href=index6.html" 
    id=test class=q>Ana sayfa</a>
    ~;

    while (
    $text=~ m/<a.*?href=(\"|)(.*?)[\s*|\"|>].*?>/gisx){
    print $2."
    \n";
    }
    Çıktısı;

    index1.html
    index2.html
    index3.html
    index4.html
    index5.html
    index6.html