项目中常常会遇到字数统计计算问题,多行文本限制最大长度问题。
最常见的计算方法是:中文字符算两个字,英文字符算一个字,不过也有一些特殊的需求。
在做字符计算的过程中,少不了正则,那就先来看一下常用的正则
正则的语法:
在这里我就写一些我待会要用到的
“+”号,表示出现一次或多次: 例:/ab+c/,可以匹配abc,abbc,abbbbbc,abbbbbbbbbbbbbbc “*”号代表字符可以不出现,可以出现一次或多次: 例:/abc*d/,可以匹配abd,abcd,abcccccd “?”号,表示可以出现一次或0次 例:/abc?d/,可以匹配abd,abcd
- 具体其他符号的用法可以参考:
http://www.runoob.com/regexp/regexp-syntax.html
http://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html
好了我们来看一下计算时会用到的方法吧
JS 中正则表达式的使用方式有两种:
- 正则表达式对象
- exec(str) : 检索字符串中指定的值。返回找到的值,并确定其位置
- test(str) : 检索字符串中指定的值。返回 true 或 false
- 字符串对象的方法
1,match(regexp) : 找到一个或多个正则表达式的匹配
2,replace(regexp) : 替换与正则表达式匹配的子串
3,search(regexp) : 检索与正则表达式相匹配的值
4,split(search) : 把字符串分割为字符串数组
5,$.trim(str):去掉前后空格
直接来看例子吧
-
直接输入的话:
每一个字符都算做一个字
如果是汉字算两个字,其他字符算一个字的话:
javascript原生function ruleOne(value) { var chinese=0; if(value.match(/[\u4e00-\u9fa5]/g)!=null){ chinese = value.match(/[\u4e00-\u9fa5]/g).length; } var valueLength = chinese+value.length; return valueLength; } function oneValue() { showText.innerHTML = inputText.value; var valueLengthOne=ruleOne(inputText.value); spanOne.innerHTML = '已经输入 ' + valueLengthOne + ' 个字' }
- 只是计算汉字(算2个字),数字,英文,不计算特殊字符
function ruleOne(value) { var chinese=0; var english=0; if(value.match(/[\u4e00-\u9fa5]/g)!=null){ chinese = value.match(/[\u4e00-\u9fa5]/g).length; } if(value.match(/[a-zA-z0-9]/g)!=null){ english = value.match(/[a-zA-z0-9]/g).length; } var valueLength = chinese*2+english; return valueLength; } function oneValue() { showText.innerHTML = inputText.value; var valueLengthOne=ruleOne(inputText.value); spanOne.innerHTML = '已经输入 ' + valueLengthOne + ' 个字' }
- 上面几个简单的例子作为铺垫之后呢,接下来我们要做的是:
1,汉字算一个字(包括汉字的标点符号);
2,一个英文单词算一个字(包括英文的标点符号,没有其他字符隔开时都是一个字;最后一个是字母,下一行开始也是字母,合起来还是一个字)
3,空格算一个字
4,换行不算字
5,最后的空格不算字(最前空格算字)
6,一个数字算一个字
var textValue=value;
textValue = textValue.replace(/\s+$/, '');//去掉后面空格
textValue=textValue.replace(/[\r\n]/g,'');//去除换行.
textValue = textValue.replace(/[0-9]/g, '全');//把数字用全角符代替
textValue = textValue.replace(/\s/g, '全');//把空格用全角符代替
textValue = textValue.replace(/[\u0000-\u00FF]/g, 'a');//所有半角符变为 a
textValue = textValue.replace(/a+/g, 'b');//把字符串变成b
得到的 textValue.length 就是输入的字数,具体例子如下图所示:
写的不好望指正 ^_~
如果有更好的方式,欢迎分享 >_<