Login   Register  
PHP Classes
elePHPant
Icontem

File: class-html_rendele.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Gündüz Can YILMAZ  >  HTML Rendele  >  class-html_rendele.php  >  Download  
File: class-html_rendele.php
Role: Class source
Content type: text/plain
Description: Required class file
Class: HTML Rendele
HTML reader, filterer and poster
Author: By
Last change: little fixes
Date: 3 years ago
Size: 12,378 bytes
 

Contents

Class file image Download
<?php

/**
    Html Rendele
    Copyright (C) 2009-2010  Gündüz Can YILMAZ

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
	
 * @author Gündüz Can YILMAZ
 * @copyright 2009-2010
 * @version 1.1.0
 * @access public
 * @site http://www.cnylmz.net
 */
class html_rendele {
	/**
	 * Bulunacak html etiketi
	 *
	 * @var string
	 */
	public $tag;
	
	/**
	 * Okunacak adres
	 *
	 * @var string
	 */
	public $url;
	
	/**
	 * Gönderilecek Referer Bilgisi
	 *
	 * @var string
	 */	
	public $referer;
	
	/**
	 *  cookie.$cookie.txt &#351;eklinde olu&#351;turulacak cookie ismi
	 *
	 * @var string
	 */	
	public $cookie;
	
	/**
	 *  Arama neticesinde bulanan taglar&#305; tutar
	 *
	 * @var array
	 */	
	public $sonuc;
	
	/**
	 *  Aranan tag özelliklerini bar&#305;nd&#305;r&#305;r
	 *
	 * @var array
	 */
	private $ozellik;

	/**
	 *  Okunan sayfan&#305;n kodlar&#305;n&#305; bar&#305;nd&#305;r&#305;r
	 *
	 * @var string
	 */
	public $harman;
	
	/**
	 *  Hangi a&#351;amada oldundu&#287;una yard&#305;mc&#305; olur
	 *
	 * @var int
	 */
	private $durum;
	
	/**
	 *  Çal&#305;&#351;ma s&#305;ras&#305;ndaki yap&#305;lanlar&#305; saklar
	 *
	 * @var string
	 */
	public $log;
	
	/**
	 *  Tag hakk&#305;ndaki geçici bilgiler tutulur
	 *
	 * @var array
	 */
	private $tag_temp;
	
	/**
	 *  Okunan sayfaya yollanacak post dizisi
	 *
	 * @var array
	 */
	public $post;
	
	/**
	 *  Okunan sayfaya gödnerilecek taray&#305;c&#305; bilgisi
	 *
	 * @var string
	 */
	private $tarayici;
	
	/**
	 * Kurucu metod
	 */
	function __construct(){
		$this->tag='';
		$this->tag_temp=array();		
		$this->url=null;
		$this->ozellik=array();
		$this->sonuc=null;
		$this->durum=0;
		$this->log='';
		$this->referer=null;
		$this->cookie=false;
		$this->post=array();
		$this->tarayici='Googlebot/2.1 (+http://www.google.com/bot.html';
	}
	
	/**
	 * Kurucu metod tekrar ça&#287;&#305;r&#305;l&#305;rak bilgiler s&#305;f&#305;rtlan&#305;r
	 */
	public function reset() {
		$this->__construct();
	}

	/**
	 * Adres okuma yerine html içeri&#287;in direk eklenmesini sa&#287;lar
	 *
	 * @param string Daha önce okunmu&#351; HTML içerik
	 */
	public function okunmus($kod_yigini) {
		if($this->durum > 0)
		$this->log.='<b>Eski kaynak kodlar&#305;n&#305;n üzerine yaz&#305;l&#305;yor!!!</b><br />';
		
		$this->harman=$kod_yigini;
		$this->log.='Kaynak kodu elle girildi, link okunmu&#351; say&#305;l&#305;yor<br />';
		
		$this->durum=1;
	}

	/**
	 * Gönderilecek taray&#305;c&#305; header bilgisini olu&#351;turur
	 *
	 * @param string taray&#305;c&#305; türü
	 */	
	public function tarayici($tarayici) {
		switch(strtolower($tarayici)) {
		case 'firefox':
			$this->tarayici='Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10';
		break;
		case 'ie':
			$this->tarayici='Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 1.1.4322)';
		break;
		default:
			$this->tarayici='Googlebot/2.1 (+http://www.google.com/bot.html';

		}
	}
	
	/**
	 * url de&#287;i&#351;keninde belirtilen adres okunur
	 *
	 * @return boolean
	 */
	public function oku() {
		
		if(empty($this->url))
		{
			$this->log.='Adres Belirtilmemi&#351;. Oku fonksiyonu ba&#351;ar&#305;s&#305;z<br />';
			return false;
		}
		
		if(strpos($this->url,'http://')===false)
		{
			$this->url='http://'.$this->url;
			$this->log.='Adrese "http://" öneki eklendi<br />';
		}
		
		$header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
		$header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
	 	$header[] = "Cache-Control: max-age=0";
  		$header[] = "Connection: keep-alive";
	  	$header[] = "Keep-Alive: 300";
	  	$header[] = "Accept-Charset: ISO-8859-9,utf-8;q=0.7,*;q=0.7";
	  	$header[] = "Accept-Language: tr-TR,tr;q=0.5";
	  	$header[] = "Pragma: ";

		$curl = curl_init();
		
		curl_setopt($curl, CURLOPT_URL, $this->url);
		
		curl_setopt($curl, CURLOPT_USERAGENT, $this->tarayici);
		
	
		if($this->referer)
		{
			if(strpos($this->referer,'http://')===false)
			{
				$this->referer='http://'.$this->referer;
				$this->log.='Referer\'a http:// ön eki eklendi<br />';
			}	
			curl_setopt($curl, CURLOPT_REFERER, $this->referer); 
		} else
			curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
		
		if($this->cookie!==false) {
			$this->log.='COOKIE al&#305;m&#305; aç&#305;ld&#305;<br />';
			curl_setopt($curl, CURLOPT_COOKIEJAR, dirname(__FILE__).'/cookie.'.$this->cookie.'.txt');	
			curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__).'/cookie.'.$this->cookie.'.txt');	
		}

		if(count($this->post)>0) {
			curl_setopt($curl, CURLOPT_POST, 1);
			
			$yolla=array();
			foreach($this->post as $name=>$value) {
				$yolla[]="$name=$value";
			}
			if(count($yolla)>1)
				$yollanacak=implode('&',$yolla);
			else
				$yollanacak=$yolla;
			curl_setopt($curl, CURLOPT_POSTFIELDS,$yollanacak);
		}
		curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); 
		curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
	
		ob_start();
		$adres=curl_exec($curl);
		curl_close($curl);
		$this->harman = str_replace('/>','>',ob_get_contents());
		ob_end_clean();
		
		if($this->durum>0)
		$this->log.='<b>Eski kaynak kodlar&#305;n&#305;n üzerine yaz&#305;l&#305;yor!!!</b><br />';
		$this->log.=$this->url.' linki okundu<br />';
		$this->durum=1;
		return true;
	}
	
	/**
	 * bulunacak tag&#305;n olmas&#305; gereken özellikleri
	 *
	 * @param string filtrelenecek özeli&#287;in ad&#305;
	 * @param string eleman&#305;n istenilen de&#287;eri
	 */
	public function tag_ozellik($ozellik,$deger) {
		$this->ozellik[$ozellik]=$deger;
	}
		
	
	private function kapananbul($harman) {
	preg_match_all('/[\/|<]'.$this->tag.'([^>]*)>/si',$harman, $bulunanlar, PREG_SET_ORDER);
	$bulunan_s=count($bulunanlar);
	$say_acik=0;
	$kapanan_temp=array();
	$ktemp['pos']=0;
	for($i=0;$i<$bulunan_s;$i++)
	{
		$ktemp['pos']=strpos($harman,$bulunanlar[$i][0],$ktemp['pos']);
		$temp['strlen']=strlen($bulunanlar[$i][0]);
		if(substr($bulunanlar[$i][0],0,1)=='<')
			{
				$ktemp['aciklar'][]=$i;
				$bulunanlar[$i]['pos_basla']=$ktemp['pos']+$temp['strlen'];
			}
		else if(substr($bulunanlar[$i][0],0,1)=='/')
			{
				@rsort($ktemp['aciklar']);
				$bulunanlar[$ktemp['aciklar'][0]]['pos_bit']=$ktemp['pos']-2;
				unset($ktemp['aciklar'][0],$bulunanlar[$i]);
			}
		$ktemp['pos']+=$temp['strlen'];
		
	}
	return $bulunanlar;		
	}
	
	private function key_sirala(& $dizi) {
		if(is_array($dizi)==false) return FALSE;
		$temp=array();
		foreach($dizi as $value)
		$temp[]=$value;
		$dizi=$temp;
	}
	
	private function ozellik_bul($harman){
		$temp=explode(' ',trim($harman));
		$temp_dizi=array();
		for($k=0;$k<count($temp);$k++)
			{
				$ozellik=explode('=',$temp[$k]);
				if($ozellik[0]=='') $ozellik[0]='icerik';
				$anahtar=$ozellik[0];
				unset($ozellik[0]);
				$deger=implode('=',$ozellik);
				if(substr($deger,0,1)=='"'||substr($deger,0,1)=="'")
				{	
					if(substr($deger,-1)!=substr($deger,0,1))
					$temp[($k+1)]=$temp[$k].' '.$temp[($k+1)];
				$deger=substr($deger,1,strlen($deger)-2);
				}
				$temp_dizi[$anahtar]=$deger;
			}
		return $temp_dizi;
	}
	
	/**
	 * türü ve özellikleri belirtilen taglar&#305; filtreler ve sonuc de&#287;i&#351;kenine yazar
	 *
	 */
	public function cek() {
		if( $this->durum <1 )
		{
	 		$this->log.='Henüz link okunmam&#305;&#351;, cek fonksiyonu link okutuyor<br />';
			if($this->oku()===false)
				return false;
		}

		   	$tag_ozellikler=$this->kapananbul($this->harman);
			$bulunan_s=count($tag_ozellikler);
		if($bulunan_s>0)
			{
				$this->key_sirala($tag_ozellikler);
				$this->log.=count($tag_ozellikler).' tane tag bulundu<br />';
				for($i=0;$i<count($tag_ozellikler);$i++)
				{
				$tag_temp=$this->ozellik_bul($tag_ozellikler[$i][1]);
				$tag_temp['icerik']=substr($this->harman,$tag_ozellikler[$i]['pos_basla'],((isset($tag_ozellikler[$i]['pos_bit'])?$tag_ozellikler[$i]['pos_bit']:0)-$tag_ozellikler[$i]['pos_basla'])+1);
				
				$tag_ozellikler[$i]=$tag_temp;
				}
			}
		else {
		
			preg_match_all('@<([a-zA-Z0-9\n\t\s=\"\']*?)'.$this->tag.'(.*?)([/]?)>@is',$this->harman,$bulunanlar);
			$bulunan_s=count($bulunanlar[2]);
		
			if($bulunan_s>0) {
				$this->log.=$bulunan_s.' tane tag bulundu<br />';
				$tag_ozellikler=array();
	
					
				for($i=0;$i<$bulunan_s;$i++)
				{
					$ozellikler=preg_replace('@\s+@',' ',str_replace(array("\n","\t"),' ',$bulunanlar[2][$i]));
					$temp=explode(' ',trim($ozellikler));
					for($k=0;$k<count($temp);$k++)
						{
							$ozellik=explode('=',$temp[$k]);
							if($ozellik[0]=='') $ozellik[0]='esas';
							$anahtar=$ozellik[0];
							unset($ozellik[0]);
							$deger=implode('=',$ozellik);
							if(substr($deger,0,1)=='"'||substr($deger,0,1)=="'")
							{
								if(substr($deger,-1)!=substr($deger,0,1))
								$temp[($k+1)]=$temp[$k].' '.$temp[($k+1)];
							$deger=substr($deger,1,strlen($deger)-2);
							}
							$tag_ozellikler[$i][$anahtar]=$deger;
						}
				}
			} else {
				$this->durum=2;
				$this->log.='Uygun tag bulunamad&#305;';
				return false;
			}
		}

		if(array_key_exists('*',$this->ozellik))
		{
			$this->sonuc=$tag_ozellikler;
			$this->log.='Tüm taglar sonuc olarak verildi<br />';
			return true;
		}
		
		if(array_key_exists('?',$this->ozellik))
		{
			$temp=count($tag_ozellikler);
			for($i=0;$i<$temp;$i++)
			{
				if(array_search($this->ozellik['?'],$tag_ozellikler[$i])===false)
				{
					unset($tag_ozellikler[$i]);
				}
				
			}
			$this->log.='Özelliklerinden herhangi biri '.$this->ozellik['?'].' olmayan taglar elendi<br />';
			unset($this->ozellik['?']);
		}
		

	$temp=count($tag_ozellikler);
	while(array_search('?',$this->ozellik)!==false)
		{
			$this->key_sirala($tag_ozellikler);
			$key=array_search('?',$this->ozellik);
			$temp=count($tag_ozellikler);
			for($i=0;$i<$temp;$i++)
			{
				if(is_array($tag_ozellikler[$i]) && array_key_exists($key,$tag_ozellikler[$i])===false)
				{
					unset($tag_ozellikler[$i]);
				}
				
			}
			$this->log.=$key.' özelli&#287;i olmayan taglar elendi<br />';
			unset($this->ozellik[$key]);
		}


		$temp=count($this->ozellik);
		if($temp>0) {
		$tag_temp=$tag_ozellikler;
		$tag_ozellikler=array();
		foreach($this->ozellik as $anahtar => $deger ) { 
			for($i=0;$i<count($tag_temp);$i++)
			{
				if(isset($tag_temp[$i][$anahtar])){
					if(strpos($deger,'||')!==false) {
					$degerler=explode('||',$deger);
					if(array_search($tag_temp[$i][$anahtar],$degerler)!==false)
						{$tag_ozellikler[]=$tag_temp[$i]; break; }
					else{
						foreach($degerler as $temp_deger) {
							if((strpos($temp_deger,'*')!=0) && strpos($tag_temp[$i][$anahtar],substr($temp_deger,0,strpos($temp_deger,'*'))!==false) )
							{ $tag_ozellikler[]=$tag_temp[$i]; break; }
							
						}
					}
					} else if($tag_temp[$i][$anahtar] == $deger)
					{
						$tag_ozellikler[]=$tag_temp[$i];
					}elseif((strpos($deger,'*')!=0) && strpos($tag_temp[$i][$anahtar],substr($deger,0,strpos($deger,'*')))!==false) {
						$tag_ozellikler[]=$tag_temp[$i];
					}
				}				
			}
		$this->log.='<b>'.$anahtar.'</b> de&#287;eri <b>'.$deger.'</b> olmayan taglar elendi<br />';
		}
		}
		
		$this->log.=count($tag_ozellikler).' adet uygun tag kald&#305;<br />';

		$this->sonuc=$tag_ozellikler;
		$this->durum=2;
		return true;
	}
	

}

?>