Düzenli İfade İle Veri Girişi Doğrulama Kontrol Sınıfı

<?php
class duzenliIfadeKontrol {
	public static function epostaKontrol($metin){
		return self::kontrol($metin,"/^[^@]*@[^@]*\.[^@]*$/");
	}
	public static function ipKontrol($metin){
		return self::kontrol($metin,"/^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.](?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$/");
	}
	public static function hexRenkKontrol($metin){
		return self::kontrol($metin,"/^#[a-fA-F0-9]{6}$/");
	}
	public static function hexNoKontrol($metin){
		return self::kontrol($metin,"/^[a-fA-F0-9]{6}$/");
	}	
	public static function rakamKontrol($metin){
		return self::kontrol($metin,"/^[-+]?\b[0-9]+(\.[0-9]+)?$/");
	}
	public static function sayiKontrol($metin){
		return self::kontrol($metin,"/^[-+]?\b[0-9]*\.?[0-9]+$/");
	}
	public static function kullaniciKontrol($metin){
		return self::kontrol($metin,"/^[a-z\d_]{4,28}$/i");
	}
	private static function kontrol($metin,$kural){
		if (preg_match($kural,$metin))
			return true;
		return false;
	}
}
echo "E-POSTA: ".duzenliIfadeKontrol::epostaKontrol("jordigirones@gmail.com")."<br>";
echo "IP: ".duzenliIfadeKontrol::ipKontrol("192.168.12.31")."<br>";
echo "HEX RENK: ".duzenliIfadeKontrol::hexRenkKontrol("#336AA9")."<br>";
echo "HEX NO: ".duzenliIfadeKontrol::hexNoKontrol("336AA9")."<br>";
echo "RAKAM: ".duzenliIfadeKontrol::rakamKontrol("12345")."<br>";
echo "SAYI: ".duzenliIfadeKontrol::sayiKontrol("12345.6789")."<br>";
echo "KULLANICI: ".duzenliIfadeKontrol::kullaniciKontrol("jgirones");
?>

Çıktısı

E-POSTA: 1
IP: 1
HEX RENK: 1
HEX NO: 1
RAKAM: 1
SAYI: 1
KULLANICI: 1

 

Düzenli İfadeler – Regular Expression Sınıfı

Düzenli ifade fonksiyonlarını pratik olarak bu sınıfla kullanmanız işlerini kolaylaştıracaktır.

<?php
class DuzenliIfade{
  public $duzenli;
  public $mod;
  public $sonuc;
  private $eslesenler;
  private $altmaskeler;
  public function __construct($duzenli=null, $mod=null){
		$this->duzenli = $duzenli;	 
		$this->mod = $mod;	 
	}
  public function match($metin, $duzenli=null, $mod=null){
    $this->kural($duzenli, $mod);	
		$res = preg_match($this->duzenliYap(), $metin, $this->sonuc, PREG_OFFSET_CAPTURE);
		$this->clear_all(); 
		if ($res){
			$this->eslesenler = new stdClass();	
			$this->eslesenler->text = $this->sonuc[0][0];
			$this->eslesenler->pos = $this->sonuc[0][1];
			$this->altmaskeler = array();
			foreach ($this->sonuc as $key=>$value){
				if($key){	
		      $submask = new stdClass();
		      $submask->text = $value[0];
		      $submask->pos = $value[1];
		      $this->altmaskeler[] = $submask;
			  } 	
		  }
		}
		return $res; 	
	}
  public function match_all($metin, $duzenli=null, $mod=null){
    $this->kural($duzenli, $mod); 
		$res = preg_match_all($this->duzenliYap(), $metin, $this->sonuc, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
		$this->clear_all(); 
		if($res){
			$this->eslesenler = array();
			$this->altmaskeler = array();	
			foreach ($this->sonuc as $key=>$value){
  	    $submask = array();	
				foreach ($value as $key1=>$value1){
					if ($key1 == 0){
						$mat = new stdClass();
						$mat->text = $value1[0];	
						$mat->pos = $value1[1];
						$this->eslesenler [] = $mat;
					}else{
						$smat = new stdClass();
						$smat->text = $value1[0];	
						$smat->pos = $value1[1];
						$submask[] = $smat;	
					}	  	
			  }
				$this->altmaskeler[] = $submask;	    	
		  }	
		}
		return $res; 	
	}
  public function replace($metin, $repl, $duzenli=null, $mod=null){
		$this->kural($duzenli, $mod);	
		return preg_replace($this->duzenliYap(), $repl, $metin);	
	}	 
  private function kural($duzenli=null, $mod=null){
		if ($duzenli) $this->duzenli = $duzenli; 	
		if ($mod) $this->mod = $mod;
	}	  	 
	private function duzenliYap(){
		return "/".str_replace("/", "\/", $this->duzenli)."/".$this->mod;	
	}
	private function clear_all(){
		if(is_array($this->eslesenler)) $this->eslesenler = null;
		if(is_object($this->eslesenler)) $this->eslesenler = null;	
		if(is_array($this->altmaskeler)) $this->altmaskeler = null;	
	}	 	 	 
}
?>

Kullanımı

<?php
$a=new DuzenliIfade;
$a->duzenli = "<a(.*?)>(.*?)</a>";	 
$metin='<a href="test.php">merhaba</a>';
if($a->match($metin)){
	 print_r($a->sonuc);
}
$a->sonuc=null;
$metin='<a href="test1.php">merhaba1</a><a href="test2.php">merhaba2</a>';
if($a->match_all($metin)){
	print_r($a->sonuc);
}
$a->sonuc=null;
$repl="$1 => $2 yazısına ait.";
$metin='<a href="test1.php">merhaba1</a><a href="test2.php">merhaba2</a>';
print_r($a->replace($metin, $repl));
?>

Çıktısı

Array
(
    [0] => Array
        (
            [0] => merhaba
            [1] => 0
        )

    [1] => Array
        (
            [0] =>  href="test.php"
            [1] => 2
        )

    [2] => Array
        (
            [0] => merhaba
            [1] => 19
        )

)
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => merhaba1
                    [1] => 0
                )

            [1] => Array
                (
                    [0] =>  href="test1.php"
                    [1] => 2
                )

            [2] => Array
                (
                    [0] => merhaba1
                    [1] => 20
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [0] => merhaba2
                    [1] => 32
                )

            [1] => Array
                (
                    [0] =>  href="test2.php"
                    [1] => 34
                )

            [2] => Array
                (
                    [0] => merhaba2
                    [1] => 52
                )

        )

)
 href="test1.php" => merhaba1 yazısına ait. href="test2.php" => merhaba2 yazısına ait.

 

Düzenli İfade İşleçleri

İşleç Açıklama
\ çeşitli kullanımları olan genel önceleme karakteri
^ konu başlangıcıyla eşleşme işleci (satır kipinde veya çok satırlı kipte)
$ konu sonuyla eşleşme işleci (satır kipinde veya çok satırlı kipte)
. (öntanımlı olarak) satırsonu hariç herhangi bir karakterle eşleşme işleci
[ Karakter sınıfı tanımı başlatma işleci
] Karakter sınıfı tanımı bitirme işleci
| veya işleci
( alt şablon başlatma işleci
) alt şablon bitirme işleci
? “(” işlecinin anlamını genişletir; 0 veya 1 kere eşleşir, ayrıca tamahkarlığa son verilir.
* 0 veya daha fazlasıyla eşleşme işleci
+ 1 veya daha fazlasıyla eşleşme işleci
{ Yineleme başlatma işleci
} Yineleme bitirme işleci
Köşeli ayraçların içinde kalan kısım “karakter sınıfı” adını alır. Bir karakter sınıfı içinde özel anlamı olan işleçler şunlardır:
\ genel önceleme karakteri
^ sınıfın ilk karakteri olduğu takdirde sınıfla eşleşmeme işleci
karakter aralığı işleci
] karakter sınıfı bitirme işleci

Örneğin ‘^’ ve ‘$’ işleçlerini ele alalım. Bunlar bir dizgeni başında ve sonunda neler yapıyor?

‘^bir’ – “bir” ile başlayan dizge.
‘yapıyor$’ – “yapıyor” ile biten dizge.
‘^elma$’ – “elma” ile başlayan ve biyen dizgeler. Bu, sorgunun kendisine, yani “elma” dizgesine eşittir.
“elma” – Herhangi bir yerinde “elma” içeren dizge.

Eğer her iki sembolü de kullanamıyorsanız, son örnekte olduğu gibi dizgeyi her yerde arayabilirsiniz.

‘*’,’?’ ve ‘+’ sembolleri vardır. Bunlar bir karaktere veya bir karakter grubuna eşit olabilir. “sıfır veya daha fazla”, “bir veya daha fazla” ve “sıfır veya bir”. Bunlar ne demektir? Birkaç örnek:

‘ab*’ – “b” karakterinden sıfır veya daha fazla olabilir. (‘a’,’ab’,’abb’,’abbb’…)
‘ab+’ – “b” karakterinden bir veya daha fazla olabilir. (‘ab’,’abbb’,’abbbb’,…)
‘ab?’ – “b” karakterinden sıfır veya bir tane var. (‘ab’,’a’)
‘a?b+$’ – “a” ile başlayan ve bir veya daha fazla “b” içeren bir dizge, başka bir dizgenin sonunda. (‘bu bir abbb’)

Ayrıca küme parantezi kullanarak içerik limitimi belirleyebilirsiniz.

‘ab{2}’ – “abb” şeklinde sadece iki “b” içeren dizge.
‘ab{2,9}’ – 2 ve 9 arasında bir sayı miktarınca “b” içeren dizge. Bu sayılara 2 ve 9 da dahildir.
‘ab{2,}’ – 2 veya daha fazla “b” içeren dizge.

Daha ayrıntılı örnek kullanımlar için bazı adresler:

İp Adres Filtreleme

Dosya Uzantısı Filtreleme

Referans Karakterler Tablosu

Php.net Sözdimi Anlatımları

Diğer Örneklemler

[abc] tek bir karakter: a, b veya c

[^abc] a, b, veya c dışında herhangi tek bir karakter.

[a-z]  a-z arasındaki herhangi bir karakter. (sadece küçük harf ve ingilizce harfler)

[a-zA-Z] a-z veya A-Z arasındaki herhangi bir karakter. (küçük büyük ingilizce harfler)

^ satır başlangıcı

$ Satır bitişi

\A string  başlangıcı

\z string bitişi

.  Herhangi bir karakter.

\s herhangi bir boşluk karakteri.

\S herhangi boşluk olmayan bir karakter

\d herhangi bir rakam

\D herhangi bir rakam olmayan karakter

\w herhangi bir kelime karakteri. harf, sayı veya alt çizgi

\W herhangi bir kelime dışı karakter

\b kelime sınırlayıcı karakter.

(…) içerideki herşeyi yakala!

(a|b) a veya b karakteri

a? sıfır veya 1 tane a karakteri

a* 0 veya 1 veya birkaç tane a karakteri

a+ 1 veya daha fazla a karakteri

a{3} tam olarak 3 tane a karakteri

a{3,} 3 veya daha fazla a karakteri

a{3,6} 3 ve 6 tane arasında a karakteri

Tüm desenleri preg_match(“/BU KISIMA YAZARAK DENEYEBİLİRSİNİZ/”,$metin);

Kalıp Bazı Örnekler

  1. </?[^>]+>
    HTML etiketlerini ifade eder.
  2. (((+|-)?\d+(\.\d*)?)|((+|-)?(\d*\.)?\d+))
    Negatif veya pozitif tam ve ondalıklı sayı.
  3. (\d{4})[.-/](\d{1,2})[.-/](\d{1,2})
    yyyy.aa.gg biçimindeki tarih bilgisi. $1 = yıl, $2 = ay, $3 = gün
  4. (?#year)(19|20)\d\d[- /.](?#month)(0[1-9]|1[012])[- /.](?#day)(0[1-9]|[12][0-9]|3[01])
    Tarih formatının başka yazımı. Burada “(?#” ilebaşlayan bölüm açıklama yazmak üzere kullanılır ve açıklama metni “)” ile sonlanır.
  5. SELECT 'BT sorguda regexp BT' REGEXP '[[:<:]]BT.*BT[[:>:]]'
    MySQL e özgü yazımla regexp kullanımı.
  6. \d{2}\s?[A-Z]{1,3}\s?\d{2,4}
    Tr plaka tanımına uygun regexp gösterimi (özel plakalar hariç).

Extralar

[] : Karakter aralığını belirtir.

[a-z] : a ile z arası tek bir karakter

[A-Z] : a ile z arası tek bir karakter

[0-9]  : 0 ile 9 arası bir rakam

[a-zA-Z0-9] : a ile z ya da A ile Z ya da 0 ile 9 arası bir karakter

[!@#$%^] : Herhangi bir ! ya da @ ya da # ya da  $ ya da % ya da ^ karakteri

ONLİNE REGEX ARAÇLARI

Aşağıdaki faydalı kaynakları da inceleyip kurcalamanızı öneriyorum.

Örnek Saat Kontrolü

$pattern= '/^([01][0-9]|[2][0-3]):[0-5][0-9]:[0-5][0-9]$/';
$content = '23:15:59';
 
if(preg_match($pattern, $content))
{
 echo 'Doğru bir saat girilmiş';
}
else
{
 echo 'Yanlış bir saat formatı girilmiş';
}

Bir sitenin başlığını çekmek

$pattern = '/<title>(.+)<\/title>/i';
$content = file_get_contents('http://phpstate.ulusanyazilim.com');
preg_match_all($pattern, $content, $results);
print_r($results);

Url Yakalama Şablonu

$pattern = '(https?:\/\/(([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}\/?[^\b\s]+))';
$content = 'Bugün http://phpstate.ulusanyazilim.com çok daha güçlü';
$replace = '<a href="$0">$1</a>';
echo preg_replace($pattern, $replace, $content);

Örnek Hava Durumu

$content = file_get_contents('http://www.mgm.gov.tr/tahmin/il-ve-ilceler.aspx?m=ISTANBUL');
 
// Derece
preg_match_all('/<em class="renkMin zemimeZ">(.+)C<\/em><\/td>/si', $content, $results);
// İlk eşleşeni alıyoruz
$degree = $results[1][0];
 
// Hava durumunun ikonu ve açıklaması
preg_match_all('/"([\wÇŞİĞÜÖöçşğüı ]+)" rowspan="2"><img src="\.\.([\w\/\.-]+)"/si', $content, $results);
$description = $results[1][0];
$image = 'http://www.mgm.gov.tr' . $results[2][0];
 
echo $degree . ' ' . $description;
echo '<img src="' . $image . '" />';

İfade Grupları

$pattern = '/(?\w+@\w+(?:\.\w+)+)/i';
$content = 'Bir kaç adres: elma@manav.com, yarimkilo@kasap.com, ates@askeriye.com';
 
preg_match_all($pattern, $content, $results);
 
print_r($results['email']);

Çıktısı

Array
(
    [0] => elma@manav.com
    [1] => yarimkilo@kasap.com
    [2] => ates@askeriye.com
)

 

Düzenli İfade Değiştiriciler

Değiştirici Açıklama
x Regexp yazımındaki boşlukları dikkate almaz
i Büyük küçük harf duyarlılığını iptal eder ( [a-z] = [A-Z] )
s Tüm satırları tek bir satır gibi işleme alır. Nokta karakteri satırbaşı simgelerini de kapsayabilir.
m Çoklu eşlemeye olanak sağlar. Her satırı ayrı değerlendirerek, ^ ve $ simgelerinin kullanımına olanak sağlar.
g Genel tarama olanağı sağlar. Regexp uyumlu bul-değiştir uygulamalarda ilk bulunan değil kurala uyan tüm değişikliklerin yapılmasını sağlar. Bu değiştirici etiket bazı uygulamalarda varsayılan olarak seçilidir.
e Sadece preg_replace() için simge geri gönderimi yapar
A Dizge başlangıcı ile eşleşmeye zorlar.(^ gibi)
D Dizge sonu ile eşleşir.m değiştiricisi varsa etkisiz kalır.($ gibi)
S Sonsuz eşleşme döngüsü için zaman kısaltma
U (?) tersine çevirir
X Ters bölü açıp kapatır /
J (?j) İsimlerin alt şablonlarda tekrarlanmasını sağlar.
u dizgelerin karakter kodlaması utf-8 varsayılan olur.

*Yukarıdaki tablo siyah en çok kullanılan yeşil az kullanılan ögelerden derlenmiştir.

<?php $metin="aliAli a0A0aa";?>

Yukarıdaki metinde “a” harfi aramak için örnek kullanımlar

<?php preg_match_all("@a@i", $metin,$cikti);?>

Çıktısı

Array
(
 [0] => Array
 (
 [0] => a
 [1] => A
 [2] => a
 [3] => A
 [4] => a
 [5] => a
 )
)
preg_match_all("@a@s", $metin,$cikti);

Çıktısı

Array
(
 [0] => Array
 (
 [0] => a
 [1] => a
 [2] => a
 [3] => a
 )
)

Düzenli İfade Ayırıcılar

Delimiter=Ayırıcı   Pattern=Şablon,Model,Kural  RegEx=RegularExpression=Düzenli,Kurallı İfade

Örnek olarak rakam algılamak için kullanılan bir örnek

preg_match(“/[0-9]/“, $metin);
preg_match(“#[0-9]#“, $metin);
Kırmızı renkli işaretlediğim /,# karakteri en sık kullanılan bir ayırıcıdır.Ayırıcılar mavi işaretlediğim pattern kuralı önüne ve arkasına gelen simgelerdir.Diğer örnekler;

preg_match(“+[a-z]+“, $metin);
preg_match(“%[a-z]%“, $metin);
preg_match(“@[a-z]@“, $metin);
preg_match(“&[a-z]&“, $metin);

Ayrıca şablon arkasına kırmızı renkle işaretlediğim değiştiriciler de eklenebilir.Örnek

preg_match(“/[a-z]/i“, $metin);

Düzenli İfade Fonksiyonları

Merhabalar, birçok kez preg_match konusunda problem çektiğimiz için size tüm kaynaklardan alınmış açıklayıcı bir makale hazırlama ihtiyacı duydum

Öncelikle bu iki terimin ne olduğuna bakalım

<b>POSIX</b>, (Portable Operating System Interface for Unix) UNIX için Taşınabilir İşletim Sistemi Arabirimi.
<b>PCRE</b>, (Perl Compatible Regular Expressions) Perl Uyumlu Düzenli İfadeler

Öncelikle PHP 5.3.0 ile yayından kalkan POSIX ve yerine kullanılacak olan PCRE fonksiyonlarına bir gözatalım.

POSIX PCRE
ereg_replace () preg_replace ()
ereg () preg_match ()
eregi_replace () preg_replace ()
eregi () preg_match ()
split () preg_split ()
spliti () preg_split ()
sql_regcase () Eşdeğer Yok

Peki nedir bu preg fonksiyonları?

preg_grep Koşula uyan dizi elemanlarını seçer. Ör:
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
preg_match Regexp koşulunu metne uygular, sonuçlar diziye aktarılır. Ör:
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
preg_match_all İki boyutlu dizi kullanarak preg_match tan farklı olarak grup elemanlarını da ayırır. Ör:
preg_match_all("|<[^>]+>(.*)</[^>]+>|U",<br> "<b>example: </b><div align=left>this is a test</div>",<br> $out, PREG_PATTERN_ORDER);
preg_replace Bul değiştir işlemini regexp uygunluğuna göre yapar. Ör:
$string = 'April 15, 2003';<br> $pattern = '/(\w+) (\d+), (\d+)/i';<br> $replacement = '${1}1,$3';<br> echo preg_replace($pattern, $replacement, $string);
preg_replace_callback preg_replace’den farklı olarak değiştirme işleminde PHP fonksiyonunu kullanır. Bu durum çok daha kapsamlı değişim yapabilme olanağı sağlar.
preg_split Regexp uyumuna göre metni bölme işlemi yapar. Ör:
$keywords = preg_split("/[\s,]+/", "hypertext<br><br />
language, programming");