这是另外一个朋友教我的,可能有问题,
要求:如下
昵称:长度最多为5个汉字或10个字母\数字。
并且是混合组合,也就是如:"9sdf你好"也是正确的昵称,
分不多,给80分$("#usernick").blur(function(){
    $(this).css("background-color","#fff");
//var re = /([^\u4E00-\u9FA5\uf900-\ufa2d\w]|[_])/g;
var re =/[a-zA-Z0-9]{1,10}|[\x4e00-\x9fa5]{1,5}/g;
if ($.trim($("#usernick").val()).length>0){
    var limit = $.trim($("#usernick").val()).replace(/([^\x00-\xff])/g,'aa').length;
if (!re.test($.trim($("#usernick").val()))) {
if (limit>10){
$("#nick_msg").html("<div class=pic></div><font color='#FFFFFF'>昵称格式不正确!</font>").show();
}
}else
{
  $("#nick_msg").html("<font color='#FFFFFF'>昵称格式正确!</font>").show();
}
}else
{
  $("#nick_msg").html("<div class=pic></div><font color='#FFFFFF'>昵称不能为空!</font>").show();
}
});php 正则表达式

解决方案 »

  1.   

    混合只能靠遍历了。。一个正则弄不了
        function checkname(v) {
            var rx = /[a-z\d]/i, rxcn = /[\x4e00-\x9fa5]/, num = 0;
            for (var i = 0, j = v.length; i < j; i++) {
                if (rx.test(v[i])) num += 1;
                else if (rxcn.test(v[i])) num += 2;
                else return false;
            }
            if (num < 1 && num > 10) return false;
            return true;
        }
        $("#usernick").blur(function () {
            $(this).css("background-color", "#fff");
            if ($.trim($("#usernick").val()).length > 0) {
                if (!checkname($.trim($("#usernick").val()))) {
                    $("#nick_msg").html("<div class=pic></div><font color='#FFFFFF'>昵称格式不正确!</font>").show();
                } else {
                    $("#nick_msg").html("<font color='#FFFFFF'>昵称格式正确!</font>").show();
                }
            } else {
                $("#nick_msg").html("<div class=pic></div><font color='#FFFFFF'>昵称不能为空!</font>").show();
            }
        }); 
      

  2.   

    To showbo  你的代码我测试下来还是有问题,如果我输入字母特别字符,表达式也表示正则。
      

  3.   

    能加你的QQ吗?我想可能是我的代码写的有误,请你指导一下,我的QQ:593894955
      

  4.   

    有个地方判断错了。。中文正则也不正确,是\u,没注意看你的是\x    function checkname(v) {
            var rx = /[a-z\d]/i, rxcn = /[\u4e00-\u9fa5]/, num = 0;////
            for (var i = 0, j = v.length; i < j; i++) {
                if (rx.test(v[i])) num += 1;
                else if (rxcn.test(v[i])) num += 2;
                else return false;
            }
            if (num < 1 || num > 10) return false;/////这个是||,写成&&了
            return true;
        }
      

  5.   

    按照你的要求改了,发出特殊字符还是过滤不掉哦。
    现在代码如下:
     function checkname(v) {         
     var rx = /[a-zA-Z\d]/i, rxcn = /[\u4e00-\u9fa5]/, num = 0;         
     for (var i = 0, j = v.length; i < j; i++) {             
    if (rx.test(v[i])) num += 1;             
    else if (rxcn.test(v[i])) num += 2;            
    else return false;        
     } 
     if (num < 1 || num > 10) return false;        
     return true;    
     }           if (!checkname($.trim($("#usernick").val()))) {
                alert("昵称格式不正确!");
                return false;
            }
      

  6.   

    代下如下:
     function checkname(v) {         
     var rx = /[a-z\d]/i, rxcn = /[\u4e00-\u9fa5]/, num = 0;         
     for (var i = 0, j = v.length; i < j; i++) {             
    if (rx.test(v[i])) num += 1;             
    else if (rxcn.test(v[i])) num += 2;            
    else return false;        
     } 
     if (num < 1 && num > 10) return false;        
     return true;    
     }          if (!checkname($.trim($("#usernick").val()))) {
                alert("昵称格式不正确!");
                return false;
            } 我发现在IE8.0也就是说在我本机上,表达式可以过滤了,目前所有版本都可以用,但是在虚拟机中用ie6.0访问本机网页时,发现过滤不了,在其它笔记本中也运行也win7系统也发现不能过滤,请问大哥,这个是什么原因啊?
      

  7.   

    不知道楼主的特殊字符指什么呢?如果是在编码在[\u4e00-\u9fa5]范围内的就不好判断了,因为属于中文的范围,要区别所有在中文范围内的特殊字符就很难搞了~
      

  8.   

    @ , .* &$^这些字符用别的机访问,正则表达式就不能过滤了。
      

  9.   

    丢IE个bug。。不同通过下标操作字符串改为charAt。。参考:IE浏览器下字符串不能通过下标获取字符
    自己以前发现过,久了搞忘记了。。    function checkname(v) {
            var rx = /[a-z\d]/i, rxcn = /[\u4e00-\u9fa5]/, num = 0,chr;
            for (var i = 0, j = v.length; i < j; i++) {
                chr = v.charAt(i);////////
                if (rx.test(chr)) { num += 1; alert('1-' + v[i]) }
                else if (rxcn.test(chr)) { num += 2; alert('CN'); }
                else return false;
            }
            if (num < 1 && num > 10) return false;
            return true;
        }
        alert(checkname('@'))
      

  10.   

    赋值你的代码,没注意你没按照#4修改判断提交,是||不是&&,用下面的更新你的checkname函数    function checkname(v) {
            var rx = /[a-z\d]/i, rxcn = /[\u4e00-\u9fa5]/, num = 0, chr;
            for (var i = 0, j = v.length; i < j; i++) {
                chr = v.charAt(i);/////////
                if (rx.test(chr)) num += 1;
                else if (rxcn.test(chr)) num += 2;
                else return false;
            }
            if (num < 1 || num > 10) return false;/////////
            return true;
        }