Gene şu sıkıcı düzenli ifadeler değil mi? Bu makalede düzenli ifadelerin
ne kadar etkileyici olduğunu bir örnek üzerinde anlatmaya çalışacağım.
Web sitelerinin birebir kopyasını kendi bilgisayarınıza kopyalayan ( Teleport gibi) programları bilirsiniz. Önce bir sayfanın kaynak kodunu indirir. İçindeki linkleri ve resim dosyalarını belirler. Sonra sıra bu link ve resim dosyalarına gelir.
Hiç elinizdeki kaynak kodun linklerini nasıl ayıklayacağınızı düşündünüz mü?
İşte düzenli ifadeler burada gerçekten harikalar yaratır.
Fazla uzatmadan örneğimize geçelim...
Web sitelerinin birebir kopyasını kendi bilgisayarınıza kopyalayan ( Teleport gibi) programları bilirsiniz. Önce bir sayfanın kaynak kodunu indirir. İçindeki linkleri ve resim dosyalarını belirler. Sonra sıra bu link ve resim dosyalarına gelir.
Hiç elinizdeki kaynak kodun linklerini nasıl ayıklayacağınızı düşündünüz mü?
İşte düzenli ifadeler burada gerçekten harikalar yaratır.
Fazla uzatmadan örneğimize geçelim...
E-Mail Yakalayıcı
Şimdi yapacağımız
örnekte önce bir web sitesinin kaynak kodunu indirip, içerisindeki e-mail
linklerini elde edeceğiz.
Öncelikle sayfanın kaynak kodunu indirelim
Bunun için iki basit metod yazdım. İlki sayfanın adresini kullanıcıdan alıyor, ikincisi sayfaya bağlanıp kaynak kodu indiriyor :
Öncelikle sayfanın kaynak kodunu indirelim
Bunun için iki basit metod yazdım. İlki sayfanın adresini kullanıcıdan alıyor, ikincisi sayfaya bağlanıp kaynak kodu indiriyor :
// Adresi Alan Metod :
private string AdresiAl()
{
string adres="http://" + txtAdres.Text;
return adres;
}
// Sayfanın Kaynak Kodunu Döndüren Metod :
private string KaynakAl(string adres)
{
lblStat.Text="Siteye Bağlanıyor...";
WebResponse benimResponse=null;
try
{
WebRequest benimWebRequest=WebRequest.Create(adres);
benimResponse=benimWebRequest.GetResponse();
}
// Eğer internet bağlantısı yoksa yada site adresi yanlış ise :
catch(WebException e)
{
lblStat.Text="Siteye Bağlanamıyor.";
return null;
}
// Site içeriği stream olarak alınıyor :
Stream str=benimResponse.GetResponseStream();
StreamReader reader=new StreamReader(str);
string kaynak=reader.ReadToEnd();
// Tüm içerik küçük harfle döndürülüyor.
//Daha fazla kontrol yapmamak için bir önlem
return kaynak.ToLower();
}
private string AdresiAl()
{
string adres="http://" + txtAdres.Text;
return adres;
}
// Sayfanın Kaynak Kodunu Döndüren Metod :
private string KaynakAl(string adres)
{
lblStat.Text="Siteye Bağlanıyor...";
WebResponse benimResponse=null;
try
{
WebRequest benimWebRequest=WebRequest.Create(adres);
benimResponse=benimWebRequest.GetResponse();
}
// Eğer internet bağlantısı yoksa yada site adresi yanlış ise :
catch(WebException e)
{
lblStat.Text="Siteye Bağlanamıyor.";
return null;
}
// Site içeriği stream olarak alınıyor :
Stream str=benimResponse.GetResponseStream();
StreamReader reader=new StreamReader(str);
string kaynak=reader.ReadToEnd();
// Tüm içerik küçük harfle döndürülüyor.
//Daha fazla kontrol yapmamak için bir önlem
return kaynak.ToLower();
}
Sayfanın kaynak
kodunu indirdikten sonra içindeki e-mail linklerini bulup bir diziye atan bir
başka fonksiyon daha yazdım. Öncelikler e-mail linkini yakalayan deseni
(pattern) açıklamaya çalışalım.
Bildiğiniz gibi e-mail linkleri
<a href="mailto:aaa@bbb.ccc"> gibi ifade edilir.
O zaman desenimiz (href=) ifadesi ile başlamalıdır.
Ardından (’) yada (") karakterleri gelebilir.
Bildiğiniz gibi e-mail linkleri
<a href="mailto:aaa@bbb.ccc"> gibi ifade edilir.
O zaman desenimiz (href=) ifadesi ile başlamalıdır.
Ardından (’) yada (") karakterleri gelebilir.
"(href=)((’)|(""))"
Sonra "mailto:" ifadesi gelir :
"(href=)((’)|(""))(mailto:)"
"mailto:" ifadesinden sonra istediğimiz ifade yani e-mail
adresi gelir. Bunu "mail" isminde bir grup tanımlayarak elde edeceğiz.
"(href=)((’)|(""))(mailto:)(?<mail>(.*))"
// (.*) ifadesi kendinden sonra gelen desene kadar her karakteri alan bir desendir.
// (.*) ifadesi kendinden sonra gelen desene kadar her karakteri alan bir desendir.
Şimdi desenimizi sonlandıralım :
"(href=)((’)|(""))(mailto:)(?<mail>(.*))((’)|(""))"
Kısaca,
"mailto:" ile tırnak karakterleri arasındaki her ifade bizim için
mail grubuna dahil oldu.
Şimdi E-mail adreslerini dizi şeklinde döndüren metodumuzu yazalım :
Şimdi E-mail adreslerini dizi şeklinde döndüren metodumuzu yazalım :
// Sayfanın içindeki mail adreslerini dizi şeklinde
döndüren metod :
private string[] MailAl(string kaynak)
{
lblStat.Text+= "Kaynak kod alındı... " + "Mailler ayrıştırılıyor... ";
// Desenimiz :
string mailDeseni=@"(href=)((’)|(""))(mailto:)(?<mail>(.*))((’)|(""))";
int i=0;
// Regular Expressionumuzu tanımlıyoruz :
Regex benimRegex=new Regex(mailDeseni);
Match str=benimRegex.Match(kaynak);
// Oluşturduğumuz deseni sitenin kaynak kodunda karşılaştırıyoruz :
MatchCollection mailCol=benimRegex.Matches(kaynak);
string[] mail=new string[mailCol.Count];
// Bulunan her e-mail adresini mail[] dizisine atıyoruz :
foreach(Match mailMatch in mailCol)
{
mail[i]=mailMatch.Groups["mail"].ToString();
i++;
}
return mail;
}
private string[] MailAl(string kaynak)
{
lblStat.Text+= "Kaynak kod alındı... " + "Mailler ayrıştırılıyor... ";
// Desenimiz :
string mailDeseni=@"(href=)((’)|(""))(mailto:)(?<mail>(.*))((’)|(""))";
int i=0;
// Regular Expressionumuzu tanımlıyoruz :
Regex benimRegex=new Regex(mailDeseni);
Match str=benimRegex.Match(kaynak);
// Oluşturduğumuz deseni sitenin kaynak kodunda karşılaştırıyoruz :
MatchCollection mailCol=benimRegex.Matches(kaynak);
string[] mail=new string[mailCol.Count];
// Bulunan her e-mail adresini mail[] dizisine atıyoruz :
foreach(Match mailMatch in mailCol)
{
mail[i]=mailMatch.Groups["mail"].ToString();
i++;
}
return mail;
}
Şimdi Yakala
butonuna basılınca icra edilecek olay kodunu yazalım :
// Şimdi e-mail yakalamak için bu yazdığımız metodları
button_Click olayı ile birleştirelim :
private void btnYakala_Click(object sender, System.EventArgs e)
{
lblStat.Text="";
if(txtAdres.Text=="")
{
MessageBox.Show("Lütfen Bir Adres Girin !");
}
else
{
// Sitenin Adresini alıyoruz :
string adres=AdresiAl();
// Sitenin Kaynak Kodunu alıyoruz :
string kaynak=KaynakAl(adres);
// E-Mail adreslerini alıyoruz :
if(kaynak!=null)
{
string[] mail=MailAl(kaynak);
lblStat.Text+="İşlem sona erdi." + mail.Length + " tane mail adresi yakalandı.";
foreach(string yakalananMail in mail)
{
// Her e-mail adresi listbox’a giriliyor :
lbxEmail.Items.Add(yakalananMail);
}
}
}
}
private void btnYakala_Click(object sender, System.EventArgs e)
{
lblStat.Text="";
if(txtAdres.Text=="")
{
MessageBox.Show("Lütfen Bir Adres Girin !");
}
else
{
// Sitenin Adresini alıyoruz :
string adres=AdresiAl();
// Sitenin Kaynak Kodunu alıyoruz :
string kaynak=KaynakAl(adres);
// E-Mail adreslerini alıyoruz :
if(kaynak!=null)
{
string[] mail=MailAl(kaynak);
lblStat.Text+="İşlem sona erdi." + mail.Length + " tane mail adresi yakalandı.";
foreach(string yakalananMail in mail)
{
// Her e-mail adresi listbox’a giriliyor :
lbxEmail.Items.Add(yakalananMail);
}
}
}
}
Açıklama
Bazı sitelerde frameset kullanıldığından sayfada e-mail linki görülse
bile programımız bunları döndürememekte. Bu sayfaların framelerinin linkleri
verilerek e-mail adresleri elde edilebilir.
Yine bazı sitelerde linkler javascript kodu ile erişildiğinden bu adreslerde programımız tarafından erişilememektedir.
Yine bazı sitelerde linkler javascript kodu ile erişildiğinden bu adreslerde programımız tarafından erişilememektedir.
Hiç yorum yok:
Yorum Gönder