1: <?php defined('_JOOS_CORE') or exit();
2:
3: /**
4: * Библиотека валидациии данных
5: *
6: * @version 1.0
7: * @package Core\Libraries
8: * @subpackage Validate
9: * @category Libraries
10: * @author Joostina Team <info@joostina.ru>
11: * @copyright (C) 2007-2012 Joostina Team
12: * @license MIT License http://www.opensource.org/licenses/mit-license.php
13: * Информация об авторах и лицензиях стороннего кода в составе Joostina CMS: docs/copyrights
14: *
15: * */
16: class joosValidate
17: {
18: /**
19: * Проверка строка на соответствие email - формату
20: *
21: * @tutorial joosValidate::is_email('admin@joostina.ru')
22: * @tutorial joosValidate::is_email('noooo@mail.ru')
23: *
24: * @param string $value email адрес для проверки
25: * @return bool результат проверки соответсвия
26: */
27: public static function is_email($value)
28: {
29: return is_string($value) && filter_var($value, FILTER_VALIDATE_EMAIL);
30: }
31:
32: /**
33: * Проверка строки на наличие в ней только цифр, либо сама строка - число
34: *
35: * @param string|int $value значение для проверки
36: *
37: * @return bool результат проверки соответсвия
38: */
39: public static function is_digital($value)
40: {
41: return filter_var($value, FILTER_VALIDATE_INT) !== false;
42: }
43:
44: /**
45: * Проверяет, что значение переменной больше чем указанное число min
46: *
47: * @param type $value значение для проверки
48: * @param type $min
49: * @return bool результат проверки соответсвия
50: */
51: public static function is_digital_value_min($value, $min)
52: {
53: return (static::is_digital($value) && (int) $value > $min);
54: }
55:
56: /**
57: * Проверяет, что значение переменной меньше чем указанное число max
58: *
59: * @param string|int $value значение для проверки
60: * @param int $max
61: * @return bool результат проверки соответсвия
62: */
63: public static function is_digital_value_max($value, $max)
64: {
65: return (static::is_digital($value) && (int) $value < $max);
66: }
67:
68: /**
69: * Проверка вхождения цифрового значения переменной в указанный диапазон min и max
70: *
71: * @param string|int $value значение для проверки
72: * @param string|int $min
73: * @param string|int $max
74: * @return bool результат проверки соответсвия
75: */
76: public static function is_digital_value_between($value, $min, $max)
77: {
78: $int_options = array("options" => array("min_range" => $min, "max_range" => $max));
79:
80: return (static::is_digital($value) && filter_var($value, FILTER_VALIDATE_INT, $int_options));
81: }
82:
83: /**
84: * Проверка строка на наличие в ней только цифр алфавита, русского и английского а-я a-z
85: *
86: * @param string $value
87: *
88: * @return bool результат проверки соответсвия
89: */
90: public static function is_alfa($value)
91: {
92: return (bool) preg_match('/^[a-zа-яё]+$/iu', (string) $value);
93: }
94:
95: /**
96: * Проверка строка на соответствие url - формату
97: *
98: * @param string $value
99: *
100: * @return bool результат проверки соответсвия
101: */
102: public static function is_url($value)
103: {
104: return (filter_var($value, FILTER_VALIDATE_URL) === false) ? false : true;
105: }
106:
107: /**
108: * Проверка переменной на то что она является массивом
109: *
110: * @param array $value
111: * @return bool результат проверки соответсвия
112: */
113: public static function is_array($value)
114: {
115: return is_array($value) || ($value instanceof ArrayAccess && $value instanceof Traversable && $value instanceof Countable);
116: }
117:
118: /**
119: * Проверка на булевый тип
120: *
121: * @param string|int|bool $value
122: * @return bool результат проверки соответсвия
123: */
124: public static function is_bool($value)
125: {
126: return filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
127: }
128:
129: /**
130: * Проверка на тип float
131: *
132: * @param string|int|float $value
133: * @return bool результат проверки соответсвия
134: */
135: public static function is_float($value)
136: {
137: return filter_var($value, FILTER_VALIDATE_FLOAT) !== false;
138: }
139:
140: /**
141: * Проверка что переменная является валидным IP адресом
142: *
143: * @param string $value
144: * @param $flags
145: * @return bool результат проверки соответсвия
146: */
147: public static function is_ip($value, $flags = null)
148: {
149: return (boolean) filter_var($value, FILTER_VALIDATE_IP, array('flags' => $flags));
150: }
151:
152: /**
153: * Проверяет, что длина строки переменной меньше чем указанное число max
154: *
155: * @param string $value
156: * @return bool результат проверки соответсвия
157: */
158: public static function is_json($value)
159: {
160: return (bool) (json_decode($value));
161: }
162:
163: /**
164: * Проверяет, что длина строки переменной меньше чем указанное число max в символах
165: *
166: * @param string $value
167: * @param int $min
168: * @param bool $inclusive проверять учитывая равенство величине
169: * @return bool результат проверки соответсвия
170: */
171: public static function is_length_min($value, $min, $inclusive = true)
172: {
173: $length = joosString::strlen($value);
174:
175: return $inclusive ? ($length >= $min) : ($length > $min);
176: }
177:
178: /**
179: * Проверяет, что длина строки переменной больше чем указанное число max в символах
180: *
181: * @param string $value
182: * @param int $max
183: * @param bool $inclusive проверять учитывая равенство величине
184: * @return bool результат проверки соответсвия
185: */
186: public static function is_length_max($value, $max, $inclusive = true)
187: {
188: $length = joosString::strlen($value);
189:
190: return $inclusive ? ($length <= $max) : ($length < $max);
191: }
192:
193: /**
194: * Проверяет что длина строки переменной входит в указанный диапазон min и max
195: *
196: * @param string $value
197: * @param int $min
198: * @param int $max
199: * @param bool $inclusive проверять учитывая равенство величине
200: * @return bool результат проверки соответсвия
201: */
202: public static function is_length_between($value, $min, $max, $inclusive = true)
203: {
204: $length = joosString::strlen($value);
205:
206: return $inclusive ? ($length >= $min && $length <= $max) : ($length > $min && $length < $max);
207: }
208:
209: /**
210: * Проверяет что все символы строки в нижнем регистре
211: *
212: * @param string $value
213: * @return bool результат проверки соответсвия
214: */
215: public static function is_lower($value)
216: {
217: return $value === joosString::strtolower($value);
218: }
219:
220: /**
221: * Проверяет что все символы строки в верхнем регистре
222: *
223: * @param string $value
224: * @return bool результат проверки соответсвия
225: */
226: public static function is_upper($value)
227: {
228: return $value === joosString::strtoupper($value);
229: }
230:
231: /**
232: * Проверка строки на соответсвие любому регулярному выражению
233: *
234: * @param string $value
235: * @param string $regex
236: * @return bool результат проверки соответсвия
237: */
238: public static function is_regex_check($value, $regex)
239: {
240: return (bool) preg_match($regex, $value);
241: }
242:
243: /**
244: * Проверяет что строка является пустотой или состояит из непечатаемых символов
245: *
246: * @param string $value
247: * @return bool результат проверки соответсвия
248: */
249: public static function is_blank($value)
250: {
251: return !static::is_regex_check($value, '/[^\\s]/');
252: }
253:
254: /**
255: * Проверяет что строка имеет хоть один видимый сивол
256: *
257: * @param string $value
258: * @return bool результат проверки соответсвия
259: */
260: public static function is_not_blank($value)
261: {
262: return !static::is_blank($value);
263: }
264:
265: /**
266: * Проверяет что строка не null
267: *
268: * @param string $value
269: * @return bool результат проверки соответсвия
270: */
271: public static function is_not_null($value)
272: {
273: return $value !== null;
274: }
275:
276: }
277:
278: /**
279: * Помошник валидации, позволяет писать в правила проверки в упрощенном стиле
280: *
281: * @tutorial joosValidateHelper::valid(11, 'int:0..10', 'Нет, в диапазон не попадает');
282: * @tutorial joosValidateHelper::valid('Hell', 'string:5..15', 'Не попадает в диапазон от :min до :max');
283: * @tutorial joosValidateHelper::valid('Привет, человеки!', 'string:8..', 'В строке должно быть не меньше :min символов');
284: * @tutorial joosValidateHelper::valid('Не..', 'string:8..');
285: * @tutorial joosValidateHelper::valid('Убить всех человеков', 'string:..32');
286: * @tutorial joosValidateHelper::valid('Быть или не быть?', 'string:8..32');
287: * @tutorial joosValidateHelper::valid(23, 'int:0..10', 'Число не подходит, оно должно быть больше :min и меньше :max');
288: * @tutorial joosValidateHelper::valid(1, 'int|float');
289: * @tutorial joosValidateHelper::valid('sdfds@asds.ru', 'email');
290: * @tutorial joosValidateHelper::valid('192.168.0.256', 'ip', 'Это не Ip!!!');
291: * @tutorial joosValidateHelper::valid('А это уже на регистр', 'lower', 'Надо всё маленькими');
292: * @tutorial joosValidateHelper::valid('234', 'int');
293: * @tutorial joosValidateHelper::valid(" \n \r \t", 'required', 'Поле не должно быть пустым!!!');
294: *
295: * @copyright на основе оригинальной разработки Nette Framework (http://nette.org)
296: */
297: class joosValidateHelper
298: {
299: /**
300: * Правила валидации через системный класс
301: * @var array
302: */
303: protected static $validators = array(// pattern
304: 'required' => 'joosValidate::is_not_blank', 'email' => 'joosValidate::is_email', 'digital' => 'joosValidate::is_digital', 'int' => 'joosValidate::is_digital', 'alpha' => 'joosValidate::is_alfa', 'url' => 'joosValidate::is_url', 'array' => 'joosValidate::is_array', 'list' => 'joosValidate::is_array', 'bool' => 'joosValidate::is_bool', 'boolean' => 'joosValidate::is_bool', 'float' => 'joosValidate::is_float', 'ip' => 'joosValidate::is_ip', 'json' => 'joosValidate::is_json', 'lower' => 'joosValidate::is_lower', 'upper' => 'joosValidate::is_upper', 'blank' => 'joosValidate::is_blank', 'space' => 'joosValidate::is_blank', 'not_blank' => 'joosValidate::is_not_blank', 'not_space' => 'joosValidate::is_not_blank', 'not_null' => 'joosValidate::is_not_null', // внутренние обработчики текущего класса
305: 'string' => 'is_string', 'object' => 'is_object', 'resource' => 'is_resource', 'scalar' => 'is_scalar', 'null' => 'is_null',);
306:
307: /**
308: * Правила рассчета длины переменной
309: * @var array
310: */
311: protected static $counters = array('string' => 'joosString::strlen', 'array' => 'count', 'list' => 'count', 'alnum' => 'joosString::strlen', 'alpha' => 'joosString::strlen', 'digit' => 'joosString::strlen', 'lower' => 'joosString::strlen', 'space' => 'joosString::strlen', 'upper' => 'joosString::strlen',);
312:
313: public static function valid($value, $expected, $message = false)
314: {
315: foreach (explode('|', $expected) as $item) {
316: list($type) = $item = explode(':', $item, 2);
317: // проверяем тип переменной
318: if (isset(static::$validators[$type])) {
319: if (!call_user_func(static::$validators[$type], $value)) {
320: continue;
321: }
322: } elseif ($type === 'number') {
323: if (!is_int($value) && !is_float($value)) {
324: continue;
325: }
326: // проверка через произвольные регулярки
327: } elseif ($type === 'pattern') {
328: if (preg_match('|^' . (isset($item[1]) ? $item[1] : '') . '$|', $value)) {
329: return TRUE;
330: }
331: continue;
332: } elseif (!$value instanceof $type) {
333: continue;
334: }
335:
336: // проверяем вхождение в разрешённый диапазон
337: if (isset($item[1])) {
338: if (isset(static::$counters[$type])) {
339: $value = call_user_func(static::$counters[$type], $value);
340: }
341: $range = explode('..', $item[1]);
342: if (!isset($range[1])) {
343: $range[1] = $range[0];
344: }
345: if (($range[0] !== '' && $value < $range[0]) || ($range[1] !== '' && $value > $range[1])) {
346: //если передана строка для форматирования предупреждения - сформируем её
347: $message = $message == false ? false : strtr($message, array(':min' => $range[0], ':max' => $range[1]));
348: continue;
349: }
350: }
351:
352: return TRUE;
353: }
354:
355: return $message;
356: }
357: }
358: