转载

一个字符串校验方法的N种写法

背景

和一个朋友聊天, 说帮他写一个方法, 校验字符串必须是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
    检测字符串是否只包含十六进制字符
正文到此结束
Loading...