Validate.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. <?php
  2. namespace Qii\Library;
  3. /**
  4. * 验证类
  5. *
  6. * 如果验证规则为空则则返回true
  7. * @Author: Jinhui Zhu
  8. * @Date: 2014-12-31 16:05:49
  9. * Use:
  10. *
  11. * $data = array(
  12. * "username"=>'jinhui.zhu@live.cn',
  13. * "qq"=>'119328118',
  14. * "nickname"=>'Jinhui.Zhu',
  15. * "id"=>'24',
  16. * );
  17. * $rules = array(
  18. * 'id'=>array(
  19. * 'required'=>true,
  20. * 'number'=>true,
  21. * ),
  22. * 'username'=>array(
  23. * 'required'=>true,
  24. * 'email'=>true,
  25. * ),
  26. * 'qq'=>array(
  27. * 'required'=>true,
  28. * 'qq'=>true,
  29. * ),
  30. * 'nickname'=>array(
  31. * 'required'=>true,
  32. * ),
  33. * 'gender' => array(
  34. * 'sets' => '1,2,3,4'
  35. * )
  36. * );
  37. * $msg = array(
  38. * 'username'=>array(
  39. * 'required'=>'用户名必须填写',
  40. * 'email'=> '用户名格式不正确',
  41. * ),
  42. * 'qq'=>array(
  43. * 'required'=> 'QQ好必须填写',
  44. * 'qq'=>'QQ号格式不正确',
  45. * ),...
  46. * );
  47. * $validate = new \Qii\Library\Validate();
  48. * $validate->verify($data, $rules, $msg);
  49. */
  50. class Validate
  51. {
  52. const VERSION = '1.2';
  53. // 验证规则
  54. public $ruleNames = array(
  55. 'required' => '必填',
  56. 'email' => '邮箱',
  57. 'idcode' => '身份证',
  58. 'number' => '数字',
  59. 'http' => '网址',
  60. 'qq' => 'qq',
  61. 'postcode' => '邮编',
  62. 'ip' => 'ip地址',
  63. 'phone' => '电话',
  64. 'telephone' => '座机',
  65. 'mobile' => '手机',
  66. 'en' => '英文字母',
  67. 'cn' => '中文',
  68. 'account' => '账户',
  69. 'date' => '日期',
  70. 'datetime' => '日期',
  71. 'safe' => '安全字符',
  72. 'password' => '密码',
  73. 'maxlength' => '最大长度',
  74. 'minlength' => '最小长度',
  75. 'length' => '固定长度',
  76. 'rangeof' => '范围',
  77. 'string' => '字符',
  78. 'sets' => '枚举',
  79. 'setsArray' => '数组',
  80. );
  81. //出错保存数据用
  82. protected $invalidFields = array();
  83. /**
  84. * 出错时候保存数据用
  85. * @param string $field 字段
  86. * @param string $rule 规则名
  87. * @param string $value
  88. */
  89. protected function setInvalidFields($field, $rule, $value, $msg = '')
  90. {
  91. $this->invalidFields['field'] = $field;
  92. $this->invalidFields['rule'] = $rule;
  93. $this->invalidFields['value'] = $value;
  94. if ($msg) $this->invalidFields['msg'] = $msg;
  95. }
  96. /**
  97. * 将错误消息保存到invalidFields的msg字段
  98. */
  99. protected function appendMessage($msg)
  100. {
  101. $this->invalidFields['msg'] = $msg;
  102. }
  103. /**
  104. * 获取验证失败的消息
  105. */
  106. public function getErrors()
  107. {
  108. return $this->invalidFields;
  109. }
  110. /**
  111. * 验证函数
  112. *
  113. * @param array $data [用户要验证的数据]
  114. * @param array $rules [验证规则]
  115. * @param array $validateErrMsg [错误信息提示]
  116. * @return bool [成功返回true, 失败返回错误信息]
  117. */
  118. public function verify($data, $rules, $validateErrMsg = array())
  119. {
  120. if (empty ($data))
  121. return false;
  122. if (empty ($rules))
  123. return true;
  124. //将data转换成数组
  125. $data = (array)$data;
  126. //以验证规则作为依据
  127. foreach ($rules AS $key => $val) {
  128. $value = isset($data[$key]) ? $data[$key] : null;
  129. if (is_array($val)) {
  130. $required = true;
  131. foreach ($val AS $validType => $v) {
  132. if ($validType == 'required') {
  133. $required = $v;
  134. if ($required && !$this->required($value)) {
  135. $this->setInvalidFields($key, $validType, $value);
  136. if (!isset($validateErrMsg[$key][$validType])) {
  137. $this->appendMessage(\Qii::i(5003, $key));
  138. return \Qii::i(5003, $key);
  139. }
  140. $this->appendMessage($validateErrMsg[$key][$validType]);
  141. return $validateErrMsg[$key][$validType];
  142. }
  143. continue;
  144. }
  145. if (!$required && !$this->required($value)) {
  146. continue;
  147. }
  148. if (!isset($this->ruleNames[$validType])) {
  149. $this->setInvalidFields($key, $validType, $value, \Qii::i(5005, $validType));
  150. return \Qii::i(5005, $validType);
  151. }
  152. if ($v == true) {
  153. if (!$this->$validType ($value, $v)) {
  154. $this->setInvalidFields($key, $validType, $value);
  155. if (!isset($validateErrMsg[$key][$validType])) {
  156. $this->appendMessage(\Qii::i(5004, $key));
  157. return \Qii::i(5004, $key);
  158. }
  159. $this->appendMessage($validateErrMsg[$key][$validType]);
  160. return $validateErrMsg[$key][$validType];
  161. }
  162. }
  163. }
  164. }
  165. }
  166. return true;
  167. }
  168. /**
  169. * 获取规则
  170. *
  171. * @param String $str
  172. * @return Bool
  173. */
  174. public function getRuleNames()
  175. {
  176. return $this->ruleNames;
  177. }
  178. /**
  179. * 设置属性规则
  180. * @param array $arr 额外增加的规则
  181. */
  182. public function setRuleNames(array $arr)
  183. {
  184. $this->ruleNames = array_merge($this->ruleNames, $arr);
  185. }
  186. /**
  187. * 验证是否为空
  188. *
  189. * @param String $str
  190. * @return Bool
  191. */
  192. public function required($str)
  193. {
  194. if (is_array($str)) return !empty($str);
  195. return trim($str) != "";
  196. }
  197. /**
  198. * 验证邮件格式
  199. */
  200. public function email($str)
  201. {
  202. return preg_match("/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/", $str);
  203. }
  204. /**
  205. * 验证身份证
  206. *
  207. * @param String $str
  208. * @return Bool
  209. */
  210. public function idcode($str)
  211. {
  212. return preg_match("/^\d{14}(\d{1}|\d{4}|(\d{3}[xX]))$/", $str);
  213. }
  214. /**
  215. * 验证http地址
  216. *
  217. * @param String $str
  218. * @return Bool
  219. */
  220. public function http($str)
  221. {
  222. return preg_match("/[a-zA-Z]+:\/\/[^\s]*/", $str);
  223. }
  224. /**
  225. * 匹配QQ号(QQ号从10000开始)
  226. *
  227. * @param String $str
  228. * @return Bool
  229. */
  230. public function qq($str)
  231. {
  232. return preg_match("/^[1-9][0-9]{4,}$/", $str);
  233. }
  234. /**
  235. * 匹配中国邮政编码
  236. *
  237. * @param String $str
  238. * @return bool
  239. */
  240. public function postcode($str)
  241. {
  242. return preg_match("/^[1-9]\d{5}$/", $str);
  243. }
  244. /**
  245. * 匹配ip地址
  246. *
  247. * @param string $str
  248. * @return bool
  249. */
  250. public function ip($str)
  251. {
  252. return preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $str);
  253. }
  254. /**
  255. * 电话号码
  256. *
  257. * @param string $str
  258. * @return bool
  259. */
  260. public function phone($str)
  261. {
  262. return $this->telephone($str) || $this->mobile($str);
  263. }
  264. /**
  265. * 匹配电话格式
  266. *
  267. * @param string $str
  268. * @return bool
  269. */
  270. public function telephone($str)
  271. {
  272. return preg_match("/^\d{3}-\d{8}$|^\d{4}-\d{7}$/", $str);
  273. }
  274. /**
  275. * 匹配手机格式
  276. *
  277. * @param string $str
  278. * @return bool
  279. */
  280. public function mobile($str)
  281. {
  282. return preg_match("/^(13[0-9]|15[0-9]|18[0-9])\d{8}$/", $str);
  283. }
  284. /**
  285. * 匹配26个英文字母
  286. *
  287. * @param string $str
  288. * @return bool
  289. */
  290. public function en($str)
  291. {
  292. return preg_match("/^[A-Za-z]+$/", $str);
  293. }
  294. /**
  295. * 匹配只有中文
  296. *
  297. * @param string $str
  298. * @return array
  299. */
  300. public function cn($str)
  301. {
  302. return preg_match("/^[\x80-\xff]+$/", $str);
  303. }
  304. /**
  305. * 验证账户(字母开头,由字母数字下划线组成,4-20字节)
  306. *
  307. * @param string $str
  308. * @return bool
  309. */
  310. public function account($str)
  311. {
  312. return preg_match("/^[a-zA-Z][a-zA-Z0-9_]{3,19}$/", $str);
  313. }
  314. /**
  315. * 验证数字
  316. *
  317. * @param int $str
  318. * @return bool
  319. */
  320. public function number($str)
  321. {
  322. return preg_match("/^[0-9]+$/", $str);
  323. }
  324. /**
  325. * 验证日期
  326. *
  327. * @param string $str
  328. * @return bool
  329. */
  330. public function date($str)
  331. {
  332. return preg_match("/^[\d]{4}\-[\d]{2}\-[\d]{2}/", $str);
  333. }
  334. /**
  335. * 验证日期
  336. * Y-m-d H:i:s
  337. * @param string $str
  338. * @return bool
  339. */
  340. public function datetime($str)
  341. {
  342. return date('Y-m-d H:i:s', strtotime($str)) == $str;
  343. }
  344. /**
  345. * 验证字符串中,不允许包含怪字符
  346. *
  347. * @param string $str
  348. * @return bool
  349. */
  350. public function safe($str)
  351. {
  352. return preg_match('/^[\x7f-\xffA-Za-z0-9_]+$/', $str);
  353. }
  354. /**
  355. * 验证密码
  356. *
  357. * @param string $str
  358. * @return bool
  359. */
  360. public function password($str)
  361. {
  362. return preg_match('/^(?![A-Z]+$)(?![a-z]+$)(?!\d+$)(?![\W_]+$)\S+$/', $str);
  363. }
  364. /**
  365. * 最大长度
  366. *
  367. * @param string $str
  368. * @param int $len
  369. * @return bool
  370. */
  371. public function maxlength($str, $len)
  372. {
  373. return strlen($str) <= $len;
  374. }
  375. /**
  376. * 最小长度
  377. *
  378. * @param string $str
  379. * @param int $len
  380. * @return bool
  381. */
  382. public function minlength($str, $len)
  383. {
  384. return strlen($str) >= $len;
  385. }
  386. /**
  387. * 字符串固定长度
  388. *
  389. * @param string $str
  390. * @param int $len
  391. * @return bool
  392. */
  393. public function length($str, $len)
  394. {
  395. return strlen($str) == $len;
  396. }
  397. /**
  398. * 字符长度范围
  399. *
  400. * @param string $str
  401. * @param string $rangeof 1,10
  402. * @return bool
  403. */
  404. public function rangeof($str, $rangeof)
  405. {
  406. $range = explode(',', str_replace(' ', '', $rangeof));
  407. if (count($range) != 2 || intval($range[0]) > intval($range[1])) return false;
  408. return $this->minlength($str, intval($range[0])) && $this->maxlength($str, intval($range[1]));
  409. }
  410. /**
  411. * 验证数据是否是字符串
  412. *
  413. * @param string $str
  414. * @return bool
  415. */
  416. public function string($str)
  417. {
  418. return is_string($str);
  419. }
  420. /**
  421. * 返回数据是否在列表中
  422. *
  423. * @param string $str
  424. * @param string $set
  425. * @return bool
  426. */
  427. public function sets($str, $set)
  428. {
  429. $sets = preg_replace("/(\"|\')/", "", explode(",", $set));
  430. return in_array($str, $sets);
  431. }
  432. /**
  433. * 返回数据是否在列表中
  434. *
  435. * @param string $str
  436. * @param string $set
  437. * @return bool
  438. */
  439. public function setsArray($str, $sets)
  440. {
  441. return in_array($str, $sets);
  442. }
  443. }