validator (Валидация данных)

Статус
В этой теме нельзя размещать новые ответы.

Slayter

Гуру форума
Регистрация
8 Апр 2006
Сообщения
231
Реакции
55
PHP:
<?php
class validator {
    
    
    private $params = array();
    private $errors = array();
    
    
    function __construct() {
        $this->params['max_len']['email'] = 50;
        $this->params['min_len']['email'] = 10;
        $this->params['max_len']['url']   = 14;
        $this->params['min_len']['url']   = 5;
        $this->params['max_len']['alphanum'] = 255;
        $this->params['min_len']['alphanum'] = 1;
        $this->params['max_len']['alpha'] = 255;
        $this->params['min_len']['alpha'] = 1;
        $this->params['max_len']['numeric'] = 30;
        $this->params['min_len']['numeric'] = 1;
        $this->params['max_len']['integer'] = 20;
        $this->params['min_len']['integer'] = 1;
        $this->params['max_len']['login'] = 4;
        $this->params['min_len']['login'] = 15;
        
        $this->errors['email']    = 'Email некоректный или неукладывается в отведенное на него кол-во символов';
        $this->errors['url']      = 'URL некоректный или неукладывается в отведенное на него кол-во символов';
        $this->errors['alphanum'] = 'Буквы и цифры не прошли проверки на свою цифробуквенность или неукладываются в отведенное на них кол-во символов';
        $this->errors['alpha']    = 'Буквы не прошли проверки на свою буквенность или неукладываются в отведенное на них кол-во символов';
        $this->errors['numeric']  = 'Число не прошло проверки на свою численность или неукладываются в отведенное на него кол-во символов';
        $this->errors['integer']  = 'Цифра не прошла проверки на свою целочисленность или неукладываются в отведенное на неё кол-во символов';
        $this->errors['equal_to'] = 'Не тоже самое';
    }
    
    public function provider($type = 'alphanum', $data, $len = NULL, $equal_len = NULL) {
        if (method_exists($this, $type)) {
            if ($type == 'equal_to') {
                if ($this->$type($data, $len, $equal_len)) {
                    return true;
                } else {
                    return false;
                }
            } else {
                if (!empty($len) && is_array($len)) {
                    if ($this->$type($data, $len)) {
                        return true;
                    } else {
                        return false;
                    }
                } else {
                    if ($this->$type($data)) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }
        }
    }
    
    public function login($login, $len = NULL) {
        if (is_array($len)) {
            $min = $len[0];
            $max = $len[1];
        } else {
            $min = $this->params['min_len']['login'];
            $max = $this->params['max_len']['login'];
        }
        if (preg_match('/^([a-zA-Z0-9\$\_\&\@\#\№]){0,}$/', $login) && $this->check_length($login, $min, $max)) {
            return true;
        } else {
            return false;
        }
    }
    
    public function email($email, $len = NULL) {
        if (is_array($len)) {
            $min = $len[0];
            $max = $len[1];
        } else {
            $min = $this->params['min_len']['email'];
            $max = $this->params['max_len']['email'];
        }
        if (isset($email) && preg_match("/^([a-zA-Z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,6}$/i",$email) && $this->check_length($email, $min, $max)) {
            return true;
        } else {
            return false;
        }
    }
    
    public function url($url, $len = NULL) {
        if (is_array($len)) {
            $min = $len[0];
            $max = $len[1];
        } else {
            $min = $this->params['min_len']['url'];
            $max = $this->params['max_len']['url'];
        }
        if (isset($url) && preg_match("/^((http|https|ftp):\/\/([a-zA-Z0-9-])+(\.([a-zA-Z0-9-])+)*(\.([a-zA-Z0-9~\/]){2,6}+)+)?$/",$url) && $this->check_length($url, $min, $max)) {
            return true;
        } else {
            return false;
        }        
    }
    
    public function captcha($first_arg) {
        if (md5(md5(strtoupper($first_arg))) == $_SESSION['captcha']) {
            return true;
        } else {
            return false;
        }
    }
    
    public function equal_to($first, $second, $len) {
        $min = $len[0];
        $max = $len[1];
        $first_len  = strlen($first);
        $second_len = strlen($second);
        if (!is_array($first) && !is_array($second)) {
            if ($first === $second && $this->check_length($first,$min,$max)) {
                return true;
            } else {
                return false;
            }
        } elseif ((is_array($first) OR !is_array($second)) || (!is_array($first) OR is_array($second)) || (count($first) != count($second))) {
            return false;
        } else {
            $temp = array();
            $temp = array_diff($first, $second);
            if (empty($temp)) {
                return true;
            } else {
                return false;
            }
        }
    }
    
    public function alphanum($alphanum, $len = NULL) {
        if (is_array($len)) {
            $min = $len[0];
            $max = $len[1];
        } else {
            $min = $this->params['min_len']['alphanum'];
            $max = $this->params['max_len']['alphanum'];
        }
        if (isset($alphanum) && preg_match('/^[[:alnum:]]+$/', $alphanum) && $this->check_length($alphanum, $min, $max))    {
            return true;
        } else {
            return false;
        }
    }

    public function alpha($alpha, $len = NULL) {
        if (is_array($len)) {
            $min = $len[0];
            $max = $len[1];
        } else {
            $min = $this->params['min_len']['alpha'];
            $max = $this->params['max_len']['alpha'];
        }
        if (isset($alpha) && preg_match('/^[[:alpha:]]+$/i', $alpha) && $this->check_length($alpha, $min, $max))    {
            return true;
        } else {
            return false;
        }
    }

    public function numeric($numeric, $len = NULL) {
        if (is_array($len)) {
            $min = $len[0];
            $max = $len[1];
        } else {
            $min = $this->params['min_len']['numeric'];
            $max = $this->params['max_len']['numeric'];
        }
        if (isset($numeric) && is_numeric($numeric) && $this->check_length($numeric, $min, $max))    {
            return true;
        } else {
            return false;
        }
    }
    
    public function integer($integer, $len = NULL) {
        if (is_array($len)) {
            $min = $len[0];
            $max = $len[1];
        } else {
            $min = $this->params['min_len']['integer'];
            $max = $this->params['max_len']['integer'];
        }
        if (isset($integer) && is_int($integer) && $this->check_length($integer, $min, $max))    {
            return true;
        } else {
            return false;
        }
    }
    
    public function phone($phone) {
        if ( !preg_match('^\+([0-9]{1,2})\s\(([0-9]{2,4})\)\s([0-9]{6,9})^', $phone) &&
             !preg_match('^\+([0-9]{1,2})\s\(([0-9]{2,4})\)\s([0-9]{3})\-([0-9]{2})\-[(0-9){2}]^', $phone) &&
             !preg_match('^([0-9]{3})\-([0-9]{3})^', $phone) &&
             !preg_match('^([0-9]{2})\-([0-9]{2})\-([0-9]{2})^', $phone) ){
            return false;
        } else {
            return true;
        }
    }
    
    public function check_length($var, $min, $max) {
        $varlen = strlen($var);
        if ($varlen >= $min && $varlen <= $max) {
            return true;
        } else {
            return false;
        }
    }
}
?>


Examples:
PHP:
<?php
$validator = new validator();
?>

<h2>Validator test</h2>
<p>
    <b>Email test</b><br />
    Email: te@me, result: <?=$validator->provider('email', 'te@me')?><br />
    Email: te@me.ru[9,20], result: <?=$validator->provider('email', 'te@me', array(9,20))?><br />
    Email: te@me.ru[5,20], result: <?=$validator->provider('email', 'te@me.ru', array(5,20))?><br />
    <hr>
    <b>URL test</b><br />
    Url: test1.ru, result: <?=$validator->provider('url', 'test1.ru')?><br />
    Url: http://test1.ru/[17,20], result: <?=$validator->provider('url', 'http://test1.ru/', array(17,20))?><br />
    Url: http://test1.ru/[5,30], result: <?=$validator->provider('url', 'http://test1.ru/', array(5,30))?><br />
    Url: https://test1.ru/[5,30], result: <?=$validator->provider('url', 'https://test1.ru/', array(5,30))?><br />
    Url: ftp://test1.ru/[5,30], result: <?=$validator->provider('url', 'ftp://test1.ru/', array(5,30))?><br />
    <hr>
    <b>EqualTo</b><br />
    Equal_to: password:qwerty, result: <?=$validator->provider('equal_to', 'password', 'qwerty')?><br />
    Equal_to: password:password, result: <?=$validator->provider('equal_to', 'password', 'password')?><br />
    <hr>
    <b>Alphanum</b><br />
    Alpha-numeric: @qwerty123, result: <?=$validator->provider('alphanum', '@qwerty123')?><br />
    Alpha-numeruc: qwerty123, result: <?=$validator->provider('alphanum', 'qwerty123')?><br />
    <hr>
    <b>Alpha</b><br />
    Alpha: @qwerty123, result: <?=$validator->provider('alpha', '@qwerty123')?><br />
    Alpha: qwerty, result: <?=$validator->provider('alpha', 'qwerty')?><br />
    <hr>
    <b>Numeric</b><br />
    Alpha: qwerty-12.3, result: <?=$validator->provider('numeric', 'qwerty-12.3')?><br />
    Alpha: -12.3, result: <?=$validator->provider('numeric', '-12.3')?><br />
    <hr>
    <b>Integer</b><br />
    Alpha: -12.3, result: <?=$validator->provider('integer', -12.3)?><br />
    Alpha: -123, result: <?=$validator->provider('integer', -123)?><br />
</p>
 
Slayter ты меня конечно извини, но что это за Юхня?
Если ты размещаешь class validator то почему нет комментов к классу и общего описания.
Вообщем читай внимательно Цель раздела - Для просмотра ссылки Войди или Зарегистрируйся .
У меня такое ощущение, что сначала пишем, а потом читаем правила раздела. Давай придерживаться структурированности.
 
Slayter ты меня конечно извини, но что это за Юхня?
Если ты размещаешь class validator то почему нет комментов к классу и общего описания.
Вообщем читай внимательно Цель раздела - Для просмотра ссылки Войди или Зарегистрируйся .
У меня такое ощущение, что сначала пишем, а потом читаем правила раздела. Давай придерживаться структурированности.
описание вполне понятно из примеров и названия топика :smmne:


что я размещаю и как - это моё дело, а никак не твоё, доча.
 
описание вполне понятно из примеров и названия топика :smmne:


что я размещаю и как - это моё дело, а никак не твоё, доча.

Название топика будет понятно только программеру, если ты уважаешь начинающих программеров, то не нужно делать тему из одного слова. С тем же успехом я могу назвать тему: Validcssreload - Ну и что тебе из это понятно, правильно ничего!

Что ты размещаешь - остальные читают, и если ты размещаешь юхню, то и читать ее никто не будет и разбираться в твоих кракозяблах.

С уважением к тебе скажу. да.. да это твоё дело, но не забывай, что мы все здесь находимся не для набирания пустых постов, я для помощи другим.
Если не уважаешь других пользователей, значит не уважаешь себя. ИМХО :mad:
 
С уважением к тебе скажу. да.. да это твоё дело, но не забывай, что мы все здесь находимся не для набирания пустых постов, я для помощи другим.
Если не уважаешь других пользователей, значит не уважаешь себя. ИМХО :mad:

какое набирание постов? о чём ты? дет.сад ромашка :D Zer кинул ссылку на раздел и предложил там отписать чо-нить. Отписал. Если уж из из темы непонятно название - то уж из примеров точно понятно. нет времени на описания и т.п. выдаю то что написал и использую у себя. кому надо тот разберётся или спросит.
 
какое набирание постов? о чём ты? дет.сад ромашка :D Zer кинул ссылку на раздел и предложил там отписать чо-нить. Отписал. Если уж из из темы непонятно название - то уж из примеров точно. нет времени на описания и т.п. выдаю то что написал и использую у себя. кому надо тот разберётся или спросит.

Zer знает что он пишет, по крайней мере по моему общению с ним я знаю - он туфту не пишет. И если просил отписать, то не чо-нить, как ты пишешь, а полезную инфу желательно с комментами. Так вот когда видишь код без описания, даже разбираться не хочется, это тоже самое что и дописывание чужих двигов, лучше написать что-то своё с нуля... ИМХО
 
Думаю стоит собирать такие классы без комментариев В одну тему.. по автору.. :-]

Slayter классно пишет.. но описание не помешало бы..

2RALF Раздел пока молод.. лучше попости свои наработки, а не разводи оффтоп :)
 
Валидация данных на наличие скриптов

PHP:
<?php

class validate
{
	var $unsafe_html;	// array of REGEXPs for validate
	var $is_valid;		// flag of data-validation
	
	function __construct()
	{
		$this->unsafe_html = array();
		
		// Составляем список валидирующих регулярных выражений
		$this->unsafe_html[] = '!javascript\s*:!is';
		$this->unsafe_html[] = '!vbscri?pt\s*:!is';
		$this->unsafe_html[] = '!<\s*embed.*swf!is';
		$this->unsafe_html[] = '!<[^>]*[^a-z]onabort\s*=!is';
		$this->unsafe_html[] = '!<[^>]*[^a-z]onblur\s*=!is';
		$this->unsafe_html[] = '!<[^>]*[^a-z]onchange\s*=!is';
		$this->unsafe_html[] = '!<[^>]*[^a-z]onfocus\s*=!is';
		$this->unsafe_html[] = '!<[^>]*[^a-z]onmouseout\s*=!is';
		$this->unsafe_html[] = '!<[^>]*[^a-z]onmouseover\s*=!is';
		$this->unsafe_html[] = '!<[^>]*[^a-z]onload\s*=!is';
		$this->unsafe_html[] = '!<[^>]*[^a-z]onreset\s*=!is';
		$this->unsafe_html[] = '!<[^>]*[^a-z]onselect\s*=!is';
		$this->unsafe_html[] = '!<[^>]*[^a-z]onsubmit\s*=!is';
		$this->unsafe_html[] = '!<[^>]*[^a-z]onunload\s*=!is';
		$this->unsafe_html[] = '!<[^>]*[^a-z]onerror\s*=!is';
		$this->unsafe_html[] = '!<[^>]*[^a-z]onclick\s*=!is';
	}
	
	function validation($data)
	{	
		// Объявляем массив регулярных выражений, которые не соответствуют политике безопасности
		$unsafe_code = array();
		
		foreach ($this->unsafe_html as $match)
		{	if(preg_match($match, $data, $matches))
			{	$unsafe_code[] = $match;
			}
		}
		// если размер массива больше нуля - отдаем наличие ошибки
		$this->is_valid=(count($unsafe_code))?false:true;
	}
}
?>


Использование:

PHP:
<?php
$validator = new validate();
$validator->validation($some_string);

// Получаем результат валидации 
$validator->is_valid;
?>
 
Slayter, зачод!

PS: Будет работать только в PHP5.
 
Slayter, зачод!

PS: Будет работать только в PHP5.
Реалистиг не зачот.. не флуди в теме :)

Вообще класс у меня для валидации всеже свой(позже засвечу), и заточен под определенные скрипты.

Ну и не стоит писать что будет работать только в php5..
PHP:
__construct
Это же и так ясно ;)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху