用JS来实现于截取中英文混合字符串方法(转载)
网站制作过程中,提示层文字超出,需要JS做字符串截取,但是呢,我们常常会烦恼文字中英文混合如何判断,因为我们知道在JS中 string.length这个值是不考虑中英文的,但是计算机对中英文的识别是 中文占2个字符,英文一个字母占一个字符(包括数字)。查阅相关资料后,最近找到一个好的办法解决此问题。
分析下逻辑,比如我们要对字符串截取10个字(英文就是20个字符),创建一个函数
view plaincopy to clipboardprint?
function SetSub(str,n){
//主体代码
}
参数n表示我们要截取的字符,参数str表示我们要处理的字符串,这里设定n为10;首先,定义个正则 变量
view plaincopy to clipboardprint?
var strReg=/[^\x00-\xff]/g;
其实这个正则并不陌生,它是判断是否为中文的正则
第二步,我们把需要的处理的字符串处理成单字符的文字
view plaincopy to clipboardprint?
var _str=str.replace(strReg,"**");
//我们将字符串中中文替换成"**"
var _len=_str.length;
//计算出整个字符串的长度,这个其实很重要
//如果长度_len<=n,我们便不处理,直接返回str,如果大于,那么进入下一步
关键的一步来了,我们要先计算 n/2的值,为什么要这个值呢,先看下面的代码
view plaincopy to clipboardprint?
var _str=str.replace(strReg,"**");
var _len=_str.length;
if(_len>n){
var _newLen=Math.floor(n/2);
var _strLen=str.length;
for(var i=_newLen;i<_strLen;i++){
var _newStr=str.substr(0,i).replace(strReg,"**");
if(_newStr.length>=n){
return str.substr(0,i)+"...";
break;
}
}
}else{
return str;
}
这里为什么是n/2呢,因为前面提到中文和英文的差别是2个字符和1个字符的差别,由于下面需要进行for的循环,考虑到中文,我们将进行极端假设法,全部中文,于是将 for循环的i初始值设定为中文的最小长度(即n/2),由于考虑到单数,于是加上Math.floor(n/2)取最小整数值。
通过for对传入的字符串依次遍历,并转化成英文,计算其长度,如果大于 n, 便终止循环并跳出。完整代码如下:
view plaincopy to clipboardprint?
function SetSub(str,n){
var strReg=/[^\x00-\xff]/g;
var _str=str.replace(strReg,"**");
var _len=_str.length;
if(_len>n){
var _newLen=Math.floor(n/2);
var _strLen=str.length;
for(var i=_newLen;i<_strLen;i++){
var _newStr=str.substr(0,i).replace(strReg,"**");
if(_newStr.length>=n){
return str.substr(0,i)+"...";
break;
}
}
}else{
return str;
}
}
SetSub("中文english",5) //中文e...
以上方法,经测试可行。
用JS来实现于截取中英文混合字符串方法(转载)的更多相关文章
- CSS截取中英文混合字符串长度
<!doctype html> <html> <head> <meta http-equiv="content-type" content ...
- Java 截取中英文混合字符串
题目: 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入&q ...
- C# 截取中英文混合字符串分行显示宽度相同
/// <summary> /// 截取方法名显示宽度 /// </summary> /// <param name=" ...
- C#截取中英文混合字符串分行显示
private int GetStrByteLength(string str) { return System.Text.Encoding.Default.GetByteCount(str); } ...
- C#与JS实现 获取指定字节长度 中英文混合字符串 的方法
平时在作数据库插入操作时,如果用 INSERT 语句向一个varchar型字段插入内容时,有时会因为插入的内容长度超出规定的长度而报错. 尤其是插入中英文混合字符串时,SQL Server中一般中文要 ...
- PHP获取中英文混合字符串长度及截取
1.字符串长度 PHP获取中英文混合字符串长度的实现代码如下,1中文=1位,2英文=1位,可自行修改 /** * PHP获取字符串中英文混合长度 * @param $str string 字符串 * ...
- 用C#截取指定长度的中英文混合字符串
很早以前写过一篇文章(用C#截取指定长度的中英文混合字符串),但是对性能没有测试,有人说我写的这个方法性能有问题,后来想,可能真会有BT之需求要求传入一个几万K甚至几M体积的字符串进来,那将会影响正则 ...
- c#的中英文混合字符串截取
public class StringHelper { public static string GetSubString(string str, int len) ...
- c#的中英文混合字符串截取 public static string SubString(string inputString, int byteLength)
/// <summary> /// c#的中英文混合字符串截取(区分中英文) /// </summary> /// <param ...
随机推荐
- bootstrap基础
相信大多数后端开发人员的html,css并不是太好(主要说我).想要做一些网页效果,难度会比较大.看了下bootstrap这个前端框架,发现这个框架比较好的解决了网页效果制作中一般性问题.总的来说,b ...
- (1)使用bash脚本实现批量添加用户
脚本实现内容: 可以指定用户名前缀,指定添加数量的批量添加用户脚本,密码为10为随机小写字母,并把用户名和密码写入文件中. 脚本代码: #!/bin/bashread -p "用户名前缀:& ...
- spoj 694. Distinct Substrings 后缀数组求不同子串的个数
题目链接:http://www.spoj.com/problems/DISUBSTR/ 思路: 每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数.如果所有的后缀按照su ...
- 每天一道Java题[3]
问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.eq ...
- PHP 类的封装和使用
类:相似的数据和数据操作的封装 class 成员量:普通的量加上一定的修饰就变成了成员量 public,protected,private 成员方法:普通的函数,加上一定的修饰,放入到类中就变成了成 ...
- Hive 桶的分区
(一).桶的概念: 对于每一个表(table)或者分区, Hive可以进一步组织成桶(没有分区能分桶吗?),也就是说桶是更为细粒度的数据范围划分.Hive也是 针对某一列进行桶的组织.Hive采用对列 ...
- Windows8.1 + Nvidia cuda8.0 + Vs2015
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Vs2015 1.查看本机配置,查看显卡类型是否支持NVIDIA GPU选中计算机-->右键属性-->设备管理 ...
- redis入门指南-附录B
- G1收集器-原创译文[未完成]
G1收集器-原创译文 原文地址 Getting Started with the G1 Garbage Collector 目的 本文介绍了如何使用G1垃圾收集器以及如何与Hotspot JVM一起使 ...
- [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper
一.需求 我们在开发中经常会遇到一些枚举,而且这些枚举类型可能会在表单中的下拉中,或者单选按钮中会用到等. 这样用是没问题的,但是用过的人都知道一个问题,就是枚举的命名问题,当然有很多人枚举直接中文命 ...