首页 新闻 会员 周边 捐助

求教一个关于个人主页名称的正则表达式

0
悬赏园豆:5 [已解决问题] 解决于 2015-05-15 02:15

我在做表单验证。对于这个名字的限定是:1-50个中文或100位以内的数字或100个以内的英文字母。例如:张三001ab,李四ac……可以3种都包含,顺序不限,但至少要有一种。请问这个正则该怎么写呢?

zanetti的主页 zanetti | 初学一级 | 园豆:128
提问于:2015-02-22 20:55
< >
分享
最佳答案
0

中文夹杂在里面确实不太好处理,换个思路:

匹配除中文、英文字母、数字以外的字符:[^(a-zA-Z0-9\u4e00-\u9fa5)]

如果匹配不成功再去判断长度超没超过100

如果匹配成功了表示输入了非法字符

收获园豆:5
nicky0227 | 小虾三级 |园豆:1069 | 2015-02-25 14:57

谢谢你的提示,我现在只能写到这步:

var oTxtNa=document.getElementById('name');
var oSpanNa=oTxtNa.nextElementSibling || oTxtNa.nextSibling;
var reName=/[^(a-zA-Z0-9\u4e00-\u9fa5)]/g;
    
    if(reName.test(oTxtNa.value)){
      alert('包含非法字符!');
    }
    else{
      var reNum=/\d/g;
      var reLet=/[a-zA-Z]/g;
      var reChi=/[\u4e00-\u9fa5]/g;

      if(oTxtNa.value.match(reNum).length<100 && oTxtNa.value.match(reLet).length<100 && oTxtNa.value.match(reChi).length<50){
        oSpanNa.style.display='none';
      }
      else{
        oSpanNa.style.display='inline-block';
      }
    }

但是这样写,三种文字必须都包含,只要有一种没有就会报错。你还能再帮帮我吗?

zanetti | 园豆:128 (初学一级) | 2015-03-04 10:42

@zanetti: 

var reNum=/\d/g;
var reLet=/[a-zA-Z]/g;
var reChi=/[\u4e00-\u9fa5]/g;
你把字符串拆开来干嘛?直接取字符串整体的字节数啊

不要直接用length,用length的话汉字的长度只算1.
把双字节的字符转换一下:

var name="我是1个ABC";
alert(name.length);  // 7
alert(alert(name.replace(/[^\x00-\xFF]/g,'**').length););  //把汉字换成"**",取值得10

nicky0227 | 园豆:1069 (小虾三级) | 2015-03-04 13:08

@nicky0227: 

      var reDou=/[^\x00-\xFF]/g;
      var iByte=oTxtNa.value.replace(reDou,'**').length;
      
      if(iByte>300){
          oSpanNa.style.display='inline-block';
      }
      else if(iByte==0){
          oSpanNa.style.display='inline-block';
      }
      else{
          oSpanNa.style.display='none';
      }

按照你的提示,我把不包含非法字符时的代码改成这样。可以输入的最大整体字节数是300,但是如果只输入200个数字,现在不会出现提示,实际上是不对的。数字最多只能输入100个。那么只取字符串的整体字节数,是不是就不可以了?

zanetti | 园豆:128 (初学一级) | 2015-03-08 22:51

@zanetti: 不懂你说的什么意思了?整体的长度不能超过300了?单独数字又要不能超过100?

nicky0227 | 园豆:1069 (小虾三级) | 2015-03-09 12:20

@nicky0227: 我在最初的问题中写了限定“最多50个中文、100个数字、100个英文字母”。这些字节数加在一起不就是100+100+100=300,同时每种文字不能超过本身的限制。

zanetti | 园豆:128 (初学一级) | 2015-03-13 21:48
其他回答(1)
0

^[(\u4e00-\u9fa5){1,50}(0-9){1,100}(a-zA-Z){1,100}]+$

Yu | 园豆:12990 (专家六级) | 2015-02-24 10:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册