正则表达式大部分内容都能看懂,但是自己去设计一个,就很难做到兼容很多情况。

网上找了一个通用版本,验证英文大小写加下划短杠和减号。

/^[a-zA-Z0-9_-]{4,20}$/

但是现在的需求是要能验证中文,就找了一个中文验证的正则:

[\u4E00-\u9FA5]

组合一下,就变成了这样:

/^([a-zA-Z0-9_-]|[\u4E00-\u9FA5]){4,20}$/

js测试可用。

var pattern = /^([a-zA-Z0-9_-]|[\u4E00-\u9FA5]){4,20}$/;
if (pattern.test('海滨擎蟹123')) {
    alert('验证成功!');
}

加上引号,放到 preg_match($pattern, $str) 中,测试,失败。

按照 preg_match+中文 找了一篇文章,作者详细的讲了 php 里对正则表达式验证的测试过程。

过程有兴趣的可以搜搜看,最终结果就是:

/^([a-zA-Z0-9_-]|[\x{4E00}-\x{9FA5}]){4,20}$/u

php 测试函数:

function preg_test($test){
//    $rule = '/^(([1-9][0-9]*)|(([0]\.\d{1,4}|[1-9][0-9]*\.\d{1,4})))$/'; //精度为1-4的浮点数或整数
    // js /^([a-zA-Z0-9_-]|[\u4E00-\u9FA5]){4,20}$/
    $rule = '/^([a-zA-Z0-9_-]|[\x{4E00}-\x{9FA5}]){4,20}$/u';// 匹配4-40位字符,允许中英文、大小写、短杠、减号。
    if(preg_match($rule,$test,$result)) {
        return '匹配成功:'.$result[0];
    } else {
        return '未找到匹配项';
    }
}

$test = isset($_GET['num']) ?  $_GET['num'] : '123.45678';

echo preg_test($test);