19 Ekim 2012

Jquery ile Ajax işlemleri

Bu yazıda Jquery ile yapılan bazı Ajax işlemlerini anlatmaya çalışacağım. Javascript'e aşina olanlar hiç zorlanmayacaktır diye tahmin ediyorum. Ajax işlemlerini yazarken siz de farkedeceksiniz jquery'nin güzelliklerini. Jquery resimi sitesinde doğal olarak tüm fonksiyonları anlatıyor ve kısa örneklerle geçilmiş hepsi. Bu yazıda genel olarak kullanılan fonksiyonlardan bahsetmek istiyorum. İlk olarak çok çok basit bir örnekle başalayalım. Bu örnek için jquery'nin ' load() ' fonksiyonunu kullanacağız.” load “ fonksiyonu kendi domanimiz içerisinden bir sayfayı belirlediğimiz bir alana yüklemeye yarıyor. Elimizde “data.php” adında bir sayfamız var diyelim. Bunun içerisindekileri bulunduğumuz sayfanın bir yerinde göstermek istiyoruz.

yazdığımızda “
” ile belirlediğimiz div içerisinde data.php içeriği gösterilir. Kaynak kodları sayfa sonunda vereceğim. Bunuda ornek_1 dosyasında bulabilirsiniz. Ajax işlemlerimizin ikincisi $.get() ve $.post() fonksiyonları ile veri göndermek ve server içerisinde işlenmiş veriyi geri almak olacak. Bildiğiniz gibi “get” metodu ile veri alan siteler http://www.getileverialinir.com?id=3&isim=abc gibi urlsinin icerisinde ? isareti olan sitelerdir. Post metodu ile veri gonderilirken url tipinde herhangibir değişiklik olmaz( ? Ve & İşareti olmaz). Aslında tamamen değişir, başka bir sayfaya yönlendiriliriz. Ancak bizim örneğimizde hiç değişmeyecek. Bu örneğimizde; (ornek_2) data.php sayfamız:

<?php 

$sarki["Baris Manco"]=array();

$sarki["Baris Manco"][]="Kara Sevda";
$sarki["Baris Manco"][]="Gulpembe";
$sarki["Baris Manco"][]="Daglar Daglar";
$sarki["Baris Manco"][]="Anliyorsun degil mi"; //en sevdigim sarki :))
$sarki["Baris Manco"][]="Kol Dugmeleri";


if($_GET != NULL) // eger get ile herhangi bir veri gonderilmisse
{
     if(isset($_GET["isim"])) //$_GET["isim"] adiyla bir degisken tanimlandi mi?
  {
       $isim=$_GET["isim"];
    $id=$_GET["id"];
    echo $sarki[$isim][$id]."
"; } } ?>

index.php sayfamızdan
veri gönderdiğimizde “.web_area” classimizin oldugu yere “Anliyorsun degil mi ” yazacak. Post metodu ile de ayni sekilde veri gonderebiliriz. Tek yapmamız gereken get yerine post yazmak. Serialize() fonksiyonu ise birden fazla veriyi göndermeye yarar. Diyelim ki bir formunuz var ve içinde doldurulmasını istediğiniz birkaç alanınız var. Sayfayı değiştirmeden bunları server'a göndermek için serialize fonksiyonunu kullanacağız. Örnek olarak ; index.php sayfamız;

//...

    
Kati:
Sivi:
Gaz:

//...


Görüldüğü gibi üç tane checkbox var. Diyelim ki bunlardan Kati ve Gaz 'ı seçtik.

Böyle bir script yazdığımızda server'a “ durum=kati&durum=gaz “ seklinde bir string gonderecek. Artık bunları nasıl kullanacaksınız orası size kalmış. (ornek_3 içerisinde sayfaların tamamını görebilirsiniz). Yeri gelmişken serialize ile daha önceki postlarımda bahsettiğim hava durumu bot'u örneğini birleştirelim. Aynı zamanda da sayfamız daha güzel görünsün diye sayfa yüklenirken kullanıcıya bir resim gösterelim. İndex php sayfamızdaki formumuz;
//...

    
Istanbul:
Ankara:
Izmir:
Bursa:
Antalya:

//...

bu sayfa içinde

cripti ile verimizi gonderiyoruz. data.php sayfamızda ise bir bot fonksiyonu var. bir de post ile gonderilmis veriyi karşılayan bölüm var. Bu bölüm;
 //...
    
     if($_POST !=NULL)
{
    if(isset($_POST["sehirler"]))
 {
      $sehirler=$_POST["sehirler"]."&"; //stringin sonuna da & ekledikki daha anlasilir bir duzenli ifade ile sehirleri ayirabilelim 
       preg_match_all('/sehir=(.*?)&/',$sehirler,$sehir_arr); //$sehir_arr  arrayini olusturduk 
    
    //tum sehirleri teker teker fonksiyonumuza gondererek hava durumunu bekliyoruz
    foreach($sehir_arr[1] as $sehir)
    {
           hava_durumu($sehir);
    }
   
 }

}

   //...

burdan sonrasını hava_durumu($sehir) fonksiyonu yapıyor. Sectiğimiz şehirler body icerisinde gösteriliyor. Şu ana kadar anlatmaya çalıştıklarım tabi ki en genel ajax fonksiyonları. En detaylı ve güvenilir bilgiyi jquery resmi sayfasında bulabilirsiniz. Görüşmek üzere.. Tüm dosyalar : https://rapidshare.com/files/3624983948/ajax.rar

18 Ekim 2012

Jquery Seçicileri


                Jquery dilinde seçicilerin(selectors) önemini jquery'de kod yazanlar bilir. Adından da anlaşılacağı gibi seçiciler html içerisinden bir veya birkaç elemanı seçmeye yarar. Seçtiğimiz elemanları daha sonra istediğimiz gibi kullanabiliriz. Öncelikle jquery'de yeni olanlar için, jquery javascript işlemlerini kolaylaştırmak için yazılmış bir kütüphanedir. Yani bu demek oluyor ki jqueryde yapılan tüm işlemleri javascriptte de yapabiliriz, ancak biraz daha başımız ağrır. Peki jqueryi yazdığımız bir sitede nasıl kullanabiliriz? Bunun için http://jquery.com/download/ adresine giderek jquery'i bilgisayarımıza indiriyoruz. Bu “.js” uzantılı bir dosyadır. Sonra sitemizde herhangi bir yere (</head> taginin hemen üzeri veya </html> 'nin hemen üzeri idealdir. Ben bunu head tagi başında kullanmayı tercih ediyorum, kodun okunmasını kolaylaştırmak ve neleri eklemiş olduğumu daha rahat görebilmek için.)


     
satırını ekliyoruz. Arkasından,


eklediğimiz zaman işimiz tamamdır. $(document).ready() demek <body onload=”fonksiyon()”> ile aynı anlama geliyor. Yani sayfa yüklenmesi bittiğinde bunu yap demek istiyoruz. Şimdiye kadarki işlemleri doğru yapıp yapmadığımızı test etmek için ;  

yaziyoruz. Eğer kutu içerisinde mesajımız çıkarsa jquery kütüphanesini ekleyebilmişiz demektir. Hatırlatmak isterim, eğer ki eklediğimiz ' ' satırı scriptimizi yazacağımız yerin altındaysa ,' $(document).ready(function(){ }); ' satırını yazmadan direk kodlamaya başlayabiliriz. Artık seçiciler konusuna girebiliriz. Bunun için öncelikle bir index.php veya index.html sayfası oluşturuyoruz. Örnek vereceğim sayfa için kodlar;
//...

  
  
//...


şeklinde. (Sayfanın en altında tüm kodları görebilirsiniz. Şu an sadece bizi ilgilendiren kısmını gösteriyorum.) Şu anda sayfamızın şekli ;

Bu kutular üzerinde fadeIn() fonksiyonunu kullanarak, seçtiğimiz kutuların görünmesini sağlayacağız. Tabiki scriptimizin başına $('.kutu').hide(); yazıyoruz ki , ilk durumda sayfamızda hiçbir kutu olmasın. $('.kutu:first') secicisi kutu classina sahip ilk div elemanini secer. Ayni sekilde first yerine last yazdigimizda kutu classina sahip en son div'i secer.
yazdığımızda çıkan sonuç ;



$('.kutu:nth-child(3)') secicisi classi kutu olan ustten 3. div'i secer.

yazdığımızda

$('.kutu:nth-child(odd)') secicisi kutu classina sahip tek sayidaki divleri secer. Ayni sekilde even olanlar da cift sayidakileri sececek.

sonuç,


$('.kutu:gt(2)') secicisi index'i 2 den buyuk olan elemanlari secer. index nedir peki ? kutu clasina sahip elemanlarin 0 dan baslayarak siralandigini dusunelim . iste bu 0,1,2... bu elemanlarin indexidir. Ayni sekilde gt yerine lt yazarsak 2'den kucuk indexler secilecek .


$('.kutu:eq(2)') secicisi index'i 2 olan elemani sececek.


$(parent > child) cinsindeki seciciler once bir parent elemanini seciyor ki bu bizim ornegimizde kutular classina sahip div elemanlari. Sonra icinden child elemanini seciyor ki bu da ornegimiz icin .sari classina sahip eleman.

yazdığımızda;

$('eleman,eleman,...') -> aralara virgül koyarak birden fazla elemani ayni anda secebiliriz.

yazdığımızda ;



:not() secicisi parantez içerisindeki eleman disindakileri secer.

yazdığımızda;



Elbette tüm seçiciler bunlardan ibaret değil. Jquery resmi sitesinde documentation içersinde çok daha kapsamlı örnekler bulabilirsiniz. Burada seçicileri ; tüm örnekleri tek bir sayfa üzerinden göstererek ve aynı fonksiyonu kullanarak daha basit bir şekilde anlatmaya çalıştım. Ayrıca jquery ile yapılabilecekleri görebilmek adına aklıma gelen en güzel örnek site ; http://net.tutsplus.com/ . Bununla birlikte Türkçe ve çok anlaşılır bir dille jquery i anlatan http://www.eburhan.com/ sitesini tavsiye ederim. Burada biraz jquery sınırları zorlanmış. Ama yeni başlasanız dahi örnekleri anlayabilirsiniz. Önümüzdeki günlerde Jquery ile Ajax işlemleri yapmayı anlatmaya çalışacağım. Görüşmek üzere.. Kaynak Kodlar:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">



 

 
 Jquery Seciciler
 
  
  
  
  
  
  </head>
  
  
  <body>
  
  
</body> </html>

17 Ekim 2012

Php bot ve download


Merhabalar ;
Bugün bir web sitesinden resim çeken ve onları indiren bir bot yapacağız. Kodumuzun daha düzenli olması ve hatalara kolay müdahele edebilmemiz için de class yapısını kullanacağız. Yazacağımız class resim dosyalarını ayrıştıracak, bir sonraki sayfanın linkini verecek ve resimleri indirecek. Yani üç metodu olan çok basit bir class olacak. Php'ye yeni başlayanlar için de class yapısının temellerini görebilmek adına faydalı olacağını düşünüyorum böyle bir yapının. Bir şeyi daha hatırlatmak isterim. Gireceğimiz sitedeki resimleri toplamak için bir emek harcanmış ve biz de bu emeğe saygısızlık yapmak istemiyoruz. Onun için kaynak belirtmeden resimleri kullanmayalım lütfen.
Resimlerini indireceğimiz site “http://firstknownwhenlost.blogspot.com/ ”. İçerisinde bir sürü birbirinden güzel resim mevcut. Yine anlatacaklarım chrome tarayıcısı için. Tabi ki diğer tarayıcılar için de benzer fonksiyonlar mevcut. Öncelikle sayfanın içindeki herhangibir resmin üzerine gelip, sağ tuşa basıp “öğeyi denetle” yapıyoruz. 

Sonra resmin kaynak kodun içerisinde kendisini belli eden bir yer arıyoruz. Tabi CTRL-U yaparak sayfa kaynağını görmek her zaman için daha faydalıdır.

Resim için kaynak kod:

<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhPXrs0QeriRgXvEh40ouiMzmOtzjxlo6IWZsA74bLtg_8bNsF4kJRhysolqtHNyxnyoPeSuc9foJSzSQE2uD0F7LUO4GYV0RSh5yt5Ar_NGEXrlBoDFnVcveF93s2UClTd8Kb1Ojbg2qS/s1600/autumn-landscape-at-goulazon-1900.jpg!Blog.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="315" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhPXrs0QeriRgXvEh40ouiMzmOtzjxlo6IWZsA74bLtg_8bNsF4kJRhysolqtHNyxnyoPeSuc9foJSzSQE2uD0F7LUO4GYV0RSh5yt5Ar_NGEXrlBoDFnVcveF93s2UClTd8Kb1Ojbg2qS/s400/autumn-landscape-at-goulazon-1900.jpg!Blog.jpg" width="400"></a></div>


bu şekilde. Şimdi biz resimleri Orijinal boyutunda almak istiyoruz. Bildiğiniz gibi resimler sitelere yüklenirken sayfa görüntüsünü bozmamak için boyutu değiştirilerek konulur. <img> ...</img> tagleri arasında kalan bölüm sayfa içerisinde göründüğü boyut, <a>...</a> tagleri içerisinde kalan bölüm ise orijinal boyut. İki tag arasına da baktığımızda göze ilk çarpan farklılık s1600 ve s400 belirteçleri. Bu da işimizi son derece kolaylaştırıyor. Orijinal boyutu almak için bir düzenli ifade yazmak istersek:
/http:\/\/(.*?)s1600(.*?)\.jpg/i” ifadesi bizim için yeterli olacaktır.
Demek istiyoruz ki
string http:// ile başlasın , sonra link'in ilk bölümü gelsin , arkasından stringin herhangi bir yerinde s1600 görelim, yine devam etsin ve .jpg ile bitsin. Bunu preg_match_all içerisinde kullanarak resimleri alıyoruz.

Geriye bir sonraki sayfanın linkini almak kalıyor. Bunun için yine “older post” linki üzerine sağ tuş ile gelerek kaynak kodu alıyoruz.
Bu da :

<span id="blog-pager-older-link">
<a class="blog-pager-older-link" href="http://firstknownwhenlost.blogspot.com/search?updated-max=2012-10-01T00:10:00-07:00&amp;max-results=8" id="Blog1_blog-pager-older-link" title="Older Posts">Older Posts</a>
</span>

burası için de “@<a class=\'blog-pager-older-link\' href=\'(.*?)\'(.*?)</a>@si“ regexini kullanarak bir sonraki sayfanın linkini alıyoruz. Bunları ne şekilde kullanacağımızı anlatmama gerek yok sanıyorum. Sayfanın altında kaynak kodu görebilirsiniz zaten.

En sonunda copy() fonksiyonu ile resim linkini ve kopyalanacak yeri belirleyip resimleri indiriyoruz. Ancak tekrar belirtiyorum, bu resimleri kaynak göstermeden kullanmayalım ki saygısızlık olmasın.
Görüşmek üzere..


Kaynak Kodlar:

classes.php:






&lt?php  


/* Webpage class -> */
class webpage
{
     
	 public $URL;// sitenin adresi
	  private $source; //kaynak kodu (string veya false)
	  public $images; //icindeki resimler array cinsinden 
	  private $id;
    
	    function webpage($url,$kaynak,$page_id)
		{
		      $this->images=array();//bos bir array actik
			 $this->source=$kaynak;
			 $this->id=$page_id;
			 $this->URL=$url;
		}
		
		/*bu fonksiyon tum resimleri $images icerisine koyacak*/
		public function get_images()
		{
		    $data=$this->source;
			preg_match_all('/http:\/\/(.*?)s1600(.*?)\.jpg/i',$data,$temp);
		    //var_dump($temp);
			$this->images=$temp[0]; //images ->> array 
			//var_dump($this->images);
		}
		
		/* Kendisinden bir sonraki sayfanin link'ini verir*/
		public function next_page()
		{
		   $data=$this->source;
		   /*
		   Older Posts
		   
		   */
		   
		   preg_match_all('@@si',$data,$temp);
		     //var_dump($temp);
			 
			 return $temp[1][0]; //bir sonraki sayfanin linki 
		}
		
		public function download()
		{
		    $image_id=0;
			foreach($this->images as $the_image)
			{
		   $file_name=$this->id."_".$image_id.".jpg";
		    copy($the_image,"images/".$file_name);
			$image_id++;
		    }
		}


}







?>

index.php:
<?php 
include("classes.php");


$link='http://firstknownwhenlost.blogspot.com/';

$data=file_get_contents($link);

$num_pages=2; //kac sayfayi ziyaret edecegiz

for($p=0;$p<$num_pages;$p++)
{
    $the_webpage=new webpage($link,$data,$p);
    $the_webpage->get_images();
	$the_webpage->download();
	$link=$the_webpage->next_page();
	$data=file_get_contents($link);
	
} 


?>

Php String Fonksiyonları


Merhabalar;
Bugün php dilindeki string fonksiyonlarından bahsetmek istiyorum. Php dilinde string ile yapılan işlemler dilin nerede ise her alanında mevcut. Bu nedenle string fonksiyonlarının da bilinmesi bir o kadar elzem. Burada anlatmak istediklerim yalnızca aklıma gelen , çok kullanılan fonksiyonlar olacak. ( [] içerisinde olan yerler doldurulması isteğe bağlı yerlerdir.)

substr(string $a,int $start, [int $length])
Adından (substring) da anlaşılacağı gibi bu fonksiyon '$a' ile verilen string'i '$start' tan başlayarak kesiyor. Eğer '$length' girmezsek sonuna kadar kesiyor. ( Eksili değerler ile sondan başlayıp da kesebiliriz) 

$str='Uzun ince bir yoldayim.';

$sub=substr($str,5);
var_dump($sub); //string 'ince bir yoldayim.' (length=18)

$sub=substr($str,7,5);
var_dump($sub); //string 'ce bi' (length=5)

$sub=substr($str,-1);
var_dump($sub); //string '.' (length=1)

$sub=substr($str,-7,-3);
var_dump($sub); //string 'lday' (length=4)

strlen(string $str)

'String length' yani verdiğimiz stringin uzunluğu demek oluyor. Sonuç pozitif bir sayı değeri döndürecek. Yani verdiğimiz stringin uzunluğunu. 
$str='Uzun ince bir yoldayim.';

$length=strlen($str);
echo $length.""; // 23

trim(string $str)

Bu fonksiyon verdiğimiz stringin başındaki ve sonundaki boşlukları siliyor. Ancak string içerisindeki boşluklara dokunmuyor. Bu fonksiyonla aynı işlevi goren ltrim() baştaki, rtrim() sondaki boşlukları siler. 

$str='Uzun ince bir yoldayim.';

$length=strlen($str);
$str='           Uzun ince bir yoldayim.                     ';

 var_dump($str); //string '           Uzun ince bir yoldayim.                     ' (length=55)

$trimmed=trim($str);
var_dump($trimmed); //string 'Uzun ince bir yoldayim.' (length=23)

str_replace(mixed $search, mixed $replace,mixed $str,[int $count])
$str içerisinde $search ile verdiğimiz değer(ler)i arar, bulduğunda $replace ile verdiğimiz değer(ler) ile değiştirir. $count ise kaç yerin değiştirildiğini sayar.
$str='Uzun ince bir yoldayim.';

$replaced=str_replace('ince','kalin',$str);
var_dump($replaced); //string 'Uzun kalin bir yoldayim.' (length=24)


$search_arr=array('Uzun','ince');
$replace_arr=array('Kisa','kalin');
$replaced=str_replace($search_arr,$replace_arr,$str);
var_dump($replaced); //string 'Kisa kalin bir yoldayim.' (length=24)


$search_arr=array('Uzun','ince');
$replace_arr=array('Kisa','kalin');
$replaced=str_replace($search_arr,$replace_arr,$str,$num);
var_dump($replaced); //string 'Kisa kalin bir yoldayim.' (length=24)

var_dump($num);//int 2

explode(string $delimiter,string $str, [int $limit])

$delimiter ile verilen karaktere göre $str'i böler. $limit ise en fazla dönebilecek elemanı belirtir. Sonuç olarak bir array döner. 
$str='Uzun ince bir yoldayim.';
$exploded=explode(' ',$str);
var_dump($exploded); 
 
/*
   Output: 
     array
  0 => string 'Uzun' (length=4)
  1 => string 'ince' (length=4)
  2 => string 'bir' (length=3)
  3 => string 'yoldayim.' (length=9)


*/

   $exploded=explode(' ',$str,2);
var_dump($exploded);
/*
Output:
   array
  0 => string 'Uzun' (length=4)
  1 => string 'ince bir yoldayim.' (length=18)


*/

implode(string $delimiter,array $str_arr)

explode fonksiyonunun tam tersini yapıyor. $delimiter ile verdiğimiz string'i araya koyarak array elemanlarını birleştirip string çıkartıyor.

$str_arr=array('Uzun ince bir yoldayim','Gidiyorum','Gunduz gece');
$imploded=implode('/',$str_arr);
var_dump($imploded); //string 'Uzun ince bir yoldayim/Gidiyorum/Gunduz gece' (length=44)
Görüşmek üzere..

Kaynak Kodlar:


<?php  

//substr() 

$str='Uzun ince bir yoldayim.';

$sub=substr($str,5);
var_dump($sub); //string 'ince bir yoldayim.' (length=18)

$sub=substr($str,7,5);
var_dump($sub); //string 'ce bi' (length=5)

$sub=substr($str,-1);
var_dump($sub); //string '.' (length=1)

$sub=substr($str,-7,-3);
var_dump($sub); //string 'lday' (length=4)
//*****

//strlen()
$str='Uzun ince bir yoldayim.';

$length=strlen($str);
echo $length."
"; //********** //trim () $str=' Uzun ince bir yoldayim. '; var_dump($str); $trimmed=trim($str); var_dump($trimmed); //************** //str_replace() $str='Uzun ince bir yoldayim.'; $replaced=str_replace('ince','kalin',$str); var_dump($replaced); $search_arr=array('Uzun','ince'); $replace_arr=array('Kisa','kalin'); $replaced=str_replace($search_arr,$replace_arr,$str); var_dump($replaced); $search_arr=array('Uzun','ince'); $replace_arr=array('Kisa','kalin'); $replaced=str_replace($search_arr,$replace_arr,$str,$num); var_dump($replaced); var_dump($num); //**************** //explode() $str='Uzun ince bir yoldayim.'; $exploded=explode(' ',$str); var_dump($exploded); $exploded=explode(' ',$str,2); var_dump($exploded); //****** //implode() $str_arr=array('Uzun ince bir yoldayim','Gidiyorum','Gunduz gece'); $imploded=implode('/',$str_arr); var_dump($imploded); //string 'Uzun ince bir yoldayim/Gidiyorum/Gunduz gece' (length=44) ?>

Php'de basit Bot


   Merhaba;
Bugün basit bir bot yapacağız. Bot derken bir siteden veri çekmek ve onu kullanmaktan bahsediyorum. Bugün anlatmaya çalışacağım çok çok basit bir bot. Ne yapıyor peki? Günlük hava durumunu öğreniyor ve sitemizde bunu gösteriyor. Çok basit olsada bilmemiz gereken temel şeyler php düzenli ifade fonksiyonları ve düzenli ifadeler tabii ki. Önceki yazılarımda bunları anlatmaya çalıştım. Sözü çok uzatmadan başlayalım;
file_get_contents(string $link); fonksiyonu ile $link adresinden tüm sitenin kaynak kodunu string olarak çekiyoruz. ($sehir yerine hangi şehri yazarsanız oranın hava durumunu görebilirsiniz.)
//...
       $sehir="ANKARA"; 
$link="http://www.mgm.gov.tr/tahmin/il-ve-ilceler.aspx?m=".$sehir;
$data=file_get_contents($link);
     //...

Şu an elimizde kocaman bir string verisi ($data) var. Peki bunun hangi kısımlarını alacağız ? Bunu görmenin yolu sitenin hangi bölümünü almak istiyorsak üzerine gelip sağ tuş yapıp, öğeyi denetle ye basmak. Bunu Chrome için anlatıyorum. Tabii ki diğer tarayıcılarda da benzer seçenekler var. Chrome'da bunu yaptığımızda ; 
şeklinde bir görüntü çıkıyor. Gördüğünüz gibi, seçmek istedimiz yerin kaynak kodu ve site üzerindeki konumu arkasına mavi renk konulmuş. Yalnız kesinlikle buna bağlı kalmayın. CTRL-U yaparak kaynak kodda da “div” lerin isimleri aynı mı , boşluk sayıları aynı mı diye kontrol edin ki kodunuz hata vermesin. Bizim alacak olduğumuz bilgiler “divSonDurum” div'i içerisinde olduğu için önce bu div elemanını bir çekelim. Burada da dikkat etmemiz gereken regex kullanmadğımız yerlerde stringimizin sitenin kaynak kodu ile tıpatıp aynı olması gerektiği.

 //... 
   preg_match_all('@
(.*?)
@si',$data,$temp); //...

Bu fonksiyon ile $data ile gelmiş olan verimiz içerisinden <div id="divSonDurum"> ile </div> içerisindeki herşeyi kesip $temp içerisine koyuyoruz. Sonrasında sıcaklık değerini bulmaya çalışıyoruz. Sıcaklığın rengi farklı olduğu için işimiz biraz daha kolay. Bu gibi yerler için genellikle özel bir class veya id kullanılır. Bu sitedede bunu belirtmek için "renkMax" class'ı kullanılmış. Yine preg_match_all ile <td><em class="renkMax"> ile </em></td> arasındaki bölümü alıyoruz ki buda sıcaklık değeridir. 
// ...

preg_match_all('@(.*?)

@si',$temp[1][0],$temp2); //Sicakligi almak

//...

Bu veriyide alıp $temp2 içerisine koyuyoruz. Peki neden $temp değilde $temp[1][0] 'ı kullandık ? var_dump($temp) yapıp $temp'in içeriğine baktığımızda uygun olan değerin [1][0] olduğunu gördüğümüz için. Bot yaparken her işlemin sonunda var_dump() yaparak hangi veriyi çektiğinizi görmenizi tavsiye ediyorum.

Sıcaklık değerini bildiğimize göre bir sonraki veriyi (hava durumu resmi) almaya başlayabiliriz. Bunu için de ;

...
preg_match_all('@<td rowspan="2"><img src="\.\.\/(.*?)" alt="(.*?)" title="(.*?)" /> </td>
@si',$temp[1][0],$temp3);
...

fonksiyonunu kullanıyoruz.

Botumuzun ekran görüntüsü ise;


Kaynak Kodlar:




<?php  

/* Hava Durumu botu*/

$sehir="ISTANBUL"; 
$link="http://www.mgm.gov.tr/tahmin/il-ve-ilceler.aspx?m=".$sehir;

$data=file_get_contents($link);

//var_dump($data); 

preg_match_all('@
(.*?)
@si',$data,$temp); //var_dump($temp); preg_match_all('@(.*?)@si',$temp[1][0],$temp2); //Sicakligi almak //var_dump($temp2); $sicaklik=$temp2[1][0]; preg_match_all('@(.*?) @si',$temp[1][0],$temp3); //var_dump($temp3); //http://www.mgm.gov.tr/FILES/imgIcon/99/e_72x72t_png/-23.png $resim='http://www.mgm.gov.tr/'.$temp3[1][0]; $durum=$temp3[2][0]; //Sonuclari gosterme echo '
'; echo 'Sehir:'.$sehir."

"; echo 'Sıcaklık: '.$sicaklik."

"; echo 'Durum: '.$durum."

"; echo 'Resim: '.''; echo '
'; ?>

Php regular expression fonksiyonları

preg_match_all(string $pattern,string $subject[,array &$matches[,int $flags=PREG_PATTERN_ORDER[,int $offset= 0]]] )

Belki de en çok kullanılan düzenli ifade fonksiyonu. $subject olarak verilen string içerisinde verilen uyuşmaları arar ve bulduğunda $matches dizisinin içerisine koyar. Eğer bulamazsa boş array döndürür.



// Comment
$text_str="Bu sabah yagmur var İstanbulda Gözlerim Dolu dolu oluyor Bilinmez yere";

$sonuclar=preg_match_all('/yagmur(.*?)dolu/',$text_str,$matches);

var_dump($matches);

var_dump çıktısı:
array
  0 => 
    array
      0 => string 'yagmur var İstanbulda Gözlerim Dolu dolu' (length=42)
  1 => 
    array
      0 => string ' var İstanbulda Gözlerim Dolu ' (length=32)
Burada önemli husus, preg_match_all sonrasında var_dump() ile sonucun ne olduğunu görmeniz. Bu sayede array'in hangi elemanını alacağımızı kolayca bulabiliyoruz. Mesela yağmur ve dolu arasındaki tum stringleri almak istiyoruz. $match=$matches[1] yaptığımızda $match Array 'i içerisine tüm istenen sonuçlar atanıyor. Yalnız $match bu durumda string değil arraydir. 


preg_match(string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

$subject olarak verilen string içerisinde verdiğimiz desene($pattern) uygunluk var mı diye bakar. Eğer uyuşma bulunursa 1 , bulunamazsa 0 döner. 



$text_str="Bu sabah yagmur var İstanbulda Gözlerim Dolu dolu oluyor Bilinmez yere ";

$sonuc=preg_match('/dolu/i',$text_str);  //int 1

$sonuc=preg_match('/bos/i',$text_str); //int 0

preg_replace(mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1[,int&$count]] )
$subject içerisinde verilen desene($pattern) uygun olan bölümleri $replacement ile verilen array, string veya integer ile değiştirir. 
$text_str="Bu sabah yagmur var İstanbulda Gözlerim Dolu dolu oluyor Bilinmez yere ";

$replace='bos';
$sonuc=preg_replace('/dolu/i',$replace,$text_str); 
// $sonuc-> Bu sabah yagmur var İstanbulda Gözlerim bos bos oluyor Bilinmez yere



$pattern=array('/dolu/i','/yagmur/');
$replace=array('bos','kar');

$sonuc=preg_replace($pattern,$replace,$text_str);
         
//$sonuc-> Bu sabah kar var İstanbulda Gözlerim bos bos oluyor Bilinmez yere 

preg_filter($pattern,$replacement,$subject,[int $limit,[int &$count]] )
preg_replace fonksiyonuna benzer , ancak preg_filter sadece eşleşmeleri döndürür..
$text_arr=array("Kedi eti yemedi","Kedi fare yedi");
      $sonuclar=preg_filter('/fare/','herseyi',$text_arr);
// Out: Kedi herseyi yedi

Dizinin ilk elemanında eşleşme bulunmadığı için onu sonuçlar içerisine koymadı. preg_replace fonksiyonundan farkı budur.

preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
fonksiyon girdi olarak bir dizi(array) ve karşılaştırma yapılacak olan şekli (pattern) alır. Eğer karşılaştırma tutarsa dizinin tutan elemanını döndürür.

$text_arr=array("Bu sabah yagmur var İstanbulda","Gözlerim","Dolu dolu oluyor","Bilinmez yere");

$sonuclar=preg_grep('/sabah/',$text_arr);
// Çıktı:   Bu sabah yagmur var İstanbulda

10 Ekim 2012

Regular Expressions -Düzenli Diller



. -> nokta karakteri string icerisinde bütün karakterler yerine kullanılabilir.
Örnek: B.rs. ->Bursa, Barsd,B3rsh...
[ ] ->nokta gibi hareket eder. Ancak parantez içerisine yazacağımız karakterler ile sınırlandırılır.
Örnek: B[u1re]rsa->Bursa,B1rsa,Brrsa veya Bersa
[1-9] -> 1'den 9'a kadar olan rakamlardan birini kullanmak istiyorsak, araya “-” işareti koyarak sınırı belirleyebiliriz.
Örnek: Bursa[1-9] ->Bursa1,Bursa2...
Örnek: Burs[a-z] ->Bursa,Bursb,Bursc... (parantez icerisindeki küçük harfe dikkat)
Örnek: Burs[a-z1-9A-Z]->Burs1,Burs7,BursA,Bursz...

? ->Kendisinden bir önceki karakteri seçilebilir hale getirir.
Örnek: Bur?sa-> Busa veya Bursa
* ->Kendisinden bir önce gelen karakteri 0 veya sonsuz sayıda tekrarlayabilir.
Örnek:Bursa*->Burs,Bursa,Bursaa,Bursaaaaaaa...
+ -> Önceki karakterin en az bir veya çok sayıda tekrar edebileceğini ifade eder.
Örnek: Bur+ ->Burs,Bursb,Bursaspor,Burdddd ...
{n} ->bir önceki karakteri “n” kadar tekrar eder. (n=1 veya n > 1 olması koşulu ile)
Örnek: Bur{3}s{2}a ->Burrrssa

{n,m} ->bir önceki karakter n ile m arasında bir sayı kadar tekrar edebilir. ( m>n ve n >=1 olması koşulu ile)
Örnek: Bursa{2,4} ->Bursaa,Bursaaa,Bursaaaa

{n, } ->bir önceki karakter en az n kere tekrar etmeli.
Örnek: Bursa{1, }->Bursa,Bursaa,Bursaaa...
( ) ->gruplama.
Örnek: (Heykel | Setbaşı) ->Heykel veya Setbaşı

[^] ->gruptaki herhangibir karakter hariç
Örnek: [^358sde]ursa ->Mursa,bursa,gursa kabul edilebilir ancak 3ursa,sursa kabul edilmez.


Karakter etiketleri
Regular expression yazımını daha kolay hale getirmek için yapılmış bir güzellik.
\d ->herhangi bir rakam olabilir. ->[0-9] ile aynıdır.
\D->rakam olmayan karakter ->[^0-9] ile aynıdır.
\w ->her hangi bir harf,rakam veya alt çizgi ->[a-zA-Z0-9_] ile aynıdır
\W->\w ifadesinin dışında kalan karakterler->[^a-zA-Z0-9_] ile aynı.
\s ->Herhangi bir boşluk karakteri [ \t\n\r\f].
\S- >Boşluk karakteri olmayan [^\t\n\r\f].


Örnek Kullanımlar:
  • E-posta adresi geçerli mi değil mi ?
    Regex: [A-Z0-9a-z_-]{1,}@[A-Z0-9a-z]{1,}\.(com|net|org) gibi bir düzenli ifade basit bir e-posta doğrulaması (sonu com,net veya org ile biten epostalar) için yeterli. Zaten internette arama yapıldığında doğrulama konularında dolusuyla site çıktığı için uzun bir şekilde anlatmaya gerek duymuyorum.
    Kullanıcıdan gelen e posta adresleri
    djdskdl.com x
    kdsl@.com x
    hdsd@ffee.net +


Asıl anlatmak istediğime gelince;
Düzenli ifadeler sadece doğrulama yapmaya yaramaz. Bunu yanında belli bir yazı içerisinden belirlediğimiz özelliklere uyan bölümleri çıkarmamıza da yarar.

Örnek :
DEĞİŞEN TEK ŞEY TEKNOLOJİ”Oliva, ‘Facebook (http://www.facebook.com) olarak neden paylaşıyoruz?’ sorusuna cevap olarak, ‘İnsan sosyal bir hayvan(http://www.hayvanlar-alemi.com). Bu yeni bir şey değil. Facebook bilinmeyen bir şey keşfetmedi. Biz insanların sevdiği, onların umursadığı şeylerle aralarında bağlar kuruyoruz’ ifadesini kullandı.
Değişen tek bir şey var, o da teknoloji’ diyen Oliva, ‘Teknoloji çok hızlı değişiyor ama biz o kadar hızlı değişmiyoruz. Telefon icat edildiği zaman, Graham Bell(http://www.buyuk-insan.com) icadının insanların etrafına toplanacağı ve dünyanın başka köşelerinden gelen mesajları dinleyecekleri bir yayın cihazı olacağını düşündü. Televizyon benzer bir evrim gösterdi. Ancak internet(http://www.w3.org) aynı değil’ dedi.
Bu yazının içerisindeki internet adreslerini bulmak istiyorsak :
http:\/\/www\.(.*?)\.[a-zA-Z]{3} ifadesi yeterli olacaktır.
Bu ifadenin söylemek istediği ; “http://www.” ile başlasın , sonrasında her türlü karakter gelsin “ (.*?) “ , ardından bir tane “.” ve son olarak 3 karakterden oluşan bir string gelsin. (“/” ve “.” karakterlerinden önce mutlaka “\”(escape quote) kullanmalıyız). Önümüzdeki günlerde düzenli ifadelerin php içerisinde nasıl kullanıldığını anlatmaya çalışacağım. İyi günler..