Собственно есть вот такой "пилотный выпуск" класса валидатора
Свернутый текст
<?php
class SimpleValidator
{
protected $patterns = array(
'login' => array(
'default' => '#^[a-z0-9_-]+$#i',
'withRussian' => '#^[a-zа-яё0-9_-]+$#i',
'withoutNum' => '#^[a-z_-]+$#i',
'onlyNum' => '#^[0-9]+$#',
'now' => '#^[a-z0-9_-]+$#i',
),
'date' => array(
'default' => '#^[0-9]{2}+\.+[0-9]{2}+\.+[0-9]{4}+$#',
':' => '#^[0-9]{2}+:+[0-9]{2}+:+[0-9]{4}+$#',
'/' => '#^[0-9]{2}+\/+[0-9]{2}+\/+[0-9]{4}+$#',
'reverse' => '#^[0-9]{4}+\/+[0-9]{2}+\/+[0-9]{2}+$#',
'now' => '#^[0-9]{2}+\.+[0-9]{2}+\.+[0-9]{4}+$#'
)
);
/*
* Устанавливает паттерн для заданной категории
* name: setPatternFor
* @param string $category
* @param string $pattern
* @return boolean
*
*/
public function setPatternFor($category, $pattern)
{
if(isset($category, $pattern))
{
if(array_key_exists($pattern, $this->patterns[$category]))
{
$this->patterns[$category]['now'] = $this->patterns[$category][$pattern];
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
/*
* Валидация данных
* name: validate
* @param string $type
* @param string $data
* @param string $pattern
* @return boolean
*
*/
public function validate($type, $data, $pattern = NULL)
{
if(isset($type, $data))
{
if(array_key_exists($type, $this->patterns))
{
if(!is_null($pattern) && array_key_exists($pattern, $this->patterns[$type]))
{
if(!preg_match($this->patterns[$type][$pattern], $data))
{
return false;
}
else
{
return true;
}
}
else
{
if(!preg_match($this->patterns[$type]['now'], $data))
{
return false;
}
else
{
return true;
}
}
}
else
{
return false;
}
}
else
{
return false;
}
}
}
Объяснять как ним пользоваться я думаю не надо. :)
Хотелось бы спросить если ли смысл лепить всё в одну функцию дальше и если есть, то, наверное, не такой вариант, как у меня?
И, если возможно, хотелось бы попросить сразу же какую-нибудь литературу по ООП, желательно для PHP >=5.3 (в мануал не отправлять)
Спустя 22 минуты, 13 секунд (15.08.2012 - 03:16) inpost написал(а):
onlynum ? is_numeric ? Ты это имел ввиду? К тому же есть уже валидатор такой среди функций на ПХП
![smile.gif](http://phpforum.su/html/emoticons/smile.gif)
Спустя 2 часа, 52 минуты, 13 секунд (15.08.2012 - 06:08) Игорь_Vasinsky написал(а):
function validate($pattern, $modificators, $data)
{
return preg_match("#".$pattern."#".$modificators, $data);
}
Спустя 16 минут, 14 секунд (15.08.2012 - 06:24) kovalevsky написал(а):
inpost
Вы имеете ввиду функцию filter_var?
Игорь_Vasinsky
спасибо за идею, но мне нельзя отказываться от массива patterns, а в таком случае всё равно прийдётся пихать много if'ov.
возможно в таком случае проще будет сделать на каждый тип отдельную ф-цию?
как Вы считаете?
Вы имеете ввиду функцию filter_var?
Игорь_Vasinsky
спасибо за идею, но мне нельзя отказываться от массива patterns, а в таком случае всё равно прийдётся пихать много if'ov.
возможно в таком случае проще будет сделать на каждый тип отдельную ф-цию?
как Вы считаете?
Спустя 47 минут, 18 секунд (15.08.2012 - 07:12) Игорь_Vasinsky написал(а):
у твоего валидатора не хватает выбора кодировки (с кирилицей в юникоде он засыпится
), да и потом - каждый сам устанавливает кол-во символов, разрешённые символы и прочее - так что у него узкое применение.
![wink.gif](http://phpforum.su/html/emoticons/wink.gif)
Спустя 55 секунд (15.08.2012 - 07:13) Игорь_Vasinsky написал(а):
Цитата |
inpost Вы имеете ввиду функцию filter_var? |
в том числе, а так он говорил про штатные функции - типа is_numeric()
Спустя 1 час, 37 минут, 44 секунды (15.08.2012 - 08:50) SlavaFr написал(а):
Цитата (kovalevsky @ 15.08.2012 - 04:24) |
возможно в таком случае проще будет сделать на каждый тип отдельную ф-цию? как Вы считаете? |
Лучше зделать на каждый тип новый валидатор.
Возможно ты уже заметил что количиство типов и категорий будет рости, а валидатор это идея которая должна тоже быть типезированной. Ну а раз валидатор это тип, то надо его описать.
interface Validator{
/**
* @return bool
*/
public function validate();
}
последующие валидаторы должны имплементировать этот интерфейс.
Спустя 45 минут, 21 секунда (15.08.2012 - 09:36) Dezigo написал(а):
Поддерживаю как сказал SlavaFr
Вот пример:
Validator (abstract)
Вот пример:
Validator (abstract)
class Validator_Email extends Validator {
private $email;
public function Validator_Email($email) {
$this->email = $email;
Validator::Validator();
}
public function validate() {
$pattern = "/^([a-zA-Z0-9])+([.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-]+)+/";
if (!preg_match($pattern, $this->email)) {
$this->setError('Invalid email address');
}
if (strlen($this->email) > 100) {
$this->setError('Address is too long');
}
}
}
Спустя 2 часа, 46 минут, 57 секунд (15.08.2012 - 12:23) kovalevsky написал(а):
Спасибо огромное за советы и подсказки.
И ещё хотелось бы уточнить, обязательно ли классу нужен конструктор и деструктор? работает и без них, но, возможно это не совсем правильно?
И ещё хотелось бы уточнить, обязательно ли классу нужен конструктор и деструктор? работает и без них, но, возможно это не совсем правильно?
Спустя 10 минут, 39 секунд (15.08.2012 - 12:33) SlavaFr написал(а):
Цитата (kovalevsky @ 15.08.2012 - 10:23) |
И ещё хотелось бы уточнить, обязательно ли классу нужен конструктор и деструктор? |
Нет. Только в случае если при создании или разрушении обэкта требуются определенные действя.
Спустя 1 час, 25 минут, 9 секунд (15.08.2012 - 13:58) inpost написал(а):
kovalevsky
Смотри, логика простая. Если без него работает - значит он не обязательный. А это значит, что их надо использовать только тогда, когда они нужны.
А всё остальное уже сам ответил и другие ответили.
Смотри, логика простая. Если без него работает - значит он не обязательный. А это значит, что их надо использовать только тогда, когда они нужны.
А всё остальное уже сам ответил и другие ответили.