一个字符串校验方法的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
    检测字符串是否只包含十六进制字符

Leave a Reply

Your email address will not be published. Required fields are marked *


To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax