Для проверки значений конкретной формы используется список вида:
имя-атрибута => имена-правил-через-запятую
На выходе валидатора либо пустой массив — признак успеха, либо список
имя-атрибута => ошибка
который можно использовать при запросе на исправление ошибок
<?php
error_reporting(E_ALL | E_STRICT);
mb_internal_encoding('utf-8');
class QbSimpleValidator
{
private
$_rules;
public function __construct(array $rules = array())
{
$this->_rules = $rules;
}
public function check($values, $appliedRules)
{
$result = array();
foreach ($values as $var => $value) {
if (!isset($appliedRules[$var]))
continue;
$list = array_map('trim', explode(',', $appliedRules[$var]));
foreach ($list as $ruleName) {
if (!isset($this->_rules[$ruleName]))
throw new Exception('Validation rule "'.$ruleName.'" not defined');
$rr = $this->_rules[$ruleName];
$message = array_pop($rr);
foreach ($rr as $r) {
if (!preg_match($r, $value)) {
$result[$var] = $message;
break 2; // leave foreach $list
}
}
}
}
return $result;
}
}
$rules = array(
'LOGIN' => array('/^[a-z0-9]{3,20}$/i',
'Username should have from 3 till 20 alpha-numeric characters'),
'PASSWORD' => array('/^[a-z0-9]{6,}$/i',
'Password should be between 6 and 20 character length'),
'MIXCASE' => array('/[A-Z]/', '/[a-z]/', '/[0-9]/',
'Password must have letters in both cases and digits'),
'NOTEMPTY' => array('/.+/',
'Field cannot be empty'),
'Y-M-D' => array('/\d{4}-\d{2}-\d{2}/',
'Date must be in YYYY-MM-DD format'),
'NAMEDOT' => array('/^[a-z0-9]+(\.[a-z0-9]+)*$/',
'Document name should contain one or more lowercase word(s) divided by comma'),
);
$v = new QbSimpleValidator($rules);
$errors = $v->check(
// form values
array(
'user_name' => 'Vaska',
'user_password' => 'Secret9',
'doc_name' => 'naming.standard',
'doc_date' => '2010-03-01'
),
// applied rules
array(
'user_name' => 'LOGIN',
'user_password' => 'PASSWORD, MIXCASE',
'doc_name' => 'NOTEMPTY',
'doc_date' => 'Y-M-D')
);
if (empty($errors)) {
echo 'All right';
} else {
foreach ($errors as $var => $error) {
echo $var . ': <em>' . $error . "</em><br />\n";
}
}
Прошу обсудить