Validate.php 9.2 KB

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