背景
和一个朋友聊天, 说帮他写一个方法, 校验字符串必须是17位, 而且只能有大写字母和数字组成。 随手写了一个, 然后脑洞略微大开了点。
最常规的写法
function input_valid($input) { $str_len = strlen($input); if ($str_len != 17) { return false; } $i = 0; for ($i; $i < $str_len; $i ++) { if (is_numeric($input[$i])) { continue; } $str_ord = ord($input[$i]); if ($str_ord > 64 && $str_ord < 91) { continue; } return false; } return true; }
没啥好解释的, 循环遍历下, 对每个字符做校验。利用了ASCII值做计算。
改用正则
function input_valid($input) { if (preg_match('/^[A-Z0-9]{17}$/',$input)) { return true; } return false; }
利用正则去匹配, 很简洁, 但扩展性就一般般了, 而且可读性不大好;正则的速度还比较慢;
改用ctype
function input_valid($input) { if (strlen($input) != 17) { return false; } if ($input == strtoupper($input) && ctype_alnum($input)) { return true; } return false; }
改用了ctype_alnum 检测字符串是不是全是字母和数字的组合, 同时利用strtoupper
判断字符串是不是不包含小写字母。
什么是ctype?
ctype是PHP内置的一个字符校验的模块,会根据当前的区域设定下(setlocal()),
检测字符或字符串是否仅包含指定类型的字符。
ctype优势
-
灵活会根据local的设定来进行判断, 前面利用ASCII值来检测在多语言的情况下就可能会有Bug.
-
性能更好
ctype使用的是原生的C库,所以性能比is_ 、str_ 、正则表达式都要好。
-
更方便ctype模块已经实现了一些检查的方法, 可以满足需求的情况的下直接拿来用, 当然更为方便了。
ctype提供的方法
- ctype_alnum
做字母和数字字符检测 - ctype_alpha
做纯字符检测 - ctype_cntrl
做控制字符检测 - ctype_digit
做纯数字检测 - ctype_graph
做可打印字符串检测,空格除外 - ctype_lower
做小写字符检测 - ctype_print
做可打印字符检测 - ctype_punct
检测可打印的字符是不是不包含空白、数字和字母 - ctype_space
做空白字符检测 - ctype_upper
做大写字母检测 - ctype_xdigit
检测字符串是否只包含十六进制字符