网站制作过程中,提示层文字超出,需要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来实现于截取中英文混合字符串方法(转载)的更多相关文章

  1. CSS截取中英文混合字符串长度

    <!doctype html> <html> <head> <meta http-equiv="content-type" content ...

  2. Java 截取中英文混合字符串

    题目: 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入&q ...

  3. C# 截取中英文混合字符串分行显示宽度相同

    /// <summary>        /// 截取方法名显示宽度        /// </summary>        /// <param name=" ...

  4. C#截取中英文混合字符串分行显示

    private int GetStrByteLength(string str) { return System.Text.Encoding.Default.GetByteCount(str); } ...

  5. C#与JS实现 获取指定字节长度 中英文混合字符串 的方法

    平时在作数据库插入操作时,如果用 INSERT 语句向一个varchar型字段插入内容时,有时会因为插入的内容长度超出规定的长度而报错. 尤其是插入中英文混合字符串时,SQL Server中一般中文要 ...

  6. PHP获取中英文混合字符串长度及截取

    1.字符串长度 PHP获取中英文混合字符串长度的实现代码如下,1中文=1位,2英文=1位,可自行修改 /** * PHP获取字符串中英文混合长度 * @param $str string 字符串 *  ...

  7. 用C#截取指定长度的中英文混合字符串

    很早以前写过一篇文章(用C#截取指定长度的中英文混合字符串),但是对性能没有测试,有人说我写的这个方法性能有问题,后来想,可能真会有BT之需求要求传入一个几万K甚至几M体积的字符串进来,那将会影响正则 ...

  8. c#的中英文混合字符串截取

    public class StringHelper     {         public static string GetSubString(string str, int len)       ...

  9. c#的中英文混合字符串截取 public static string SubString(string inputString, int byteLength)

    /// <summary>        /// c#的中英文混合字符串截取(区分中英文)        /// </summary>        /// <param ...

随机推荐

  1. Ehcache 的简单实用 及配置

    Ehcache 与 spring 整合后的用法,下面是一个Ehcache.xml配置文件: 通用的缓存策略 可以用一个 cache: <?xml version="1.0" ...

  2. R的变量类型和常用函数

    一.R的变量类型 也可以说是数据存储方式,有: Vector: 一维阵列 Matrics: 二维阵列,其中所有元素是同一数据类型. factor: 种类变量,可使用levels函数来规定种类变量的各级 ...

  3. poj2513- Colored Sticks 字典树+欧拉通路判断

    题目链接:http://poj.org/problem?id=2513 思路很容易想到就是判断欧拉通路 预处理时用字典树将每个单词和数字对应即可 刚开始在并查集处理的时候出错了 代码: #includ ...

  4. Java IO详解(一)------File 类

    File 类:文件和目录路径名的抽象表示. 注意:File 类只能操作文件的属性,文件的内容是不能操作的. 1.File 类的字段 我们知道,各个平台之间的路径分隔符是不一样的. ①.对于UNIX平台 ...

  5. 分享一个超级好用的php程序员工具箱

    分享一个超级好用的php程序员工具箱,是由php中文网开发的. 集合了php环境搭建.在线小工具.原生手册.文字与视频教程.问答社区等 (php程序员工具箱 v0.1版本,点此下载:http://ww ...

  6. 最全DOS的CMD命令,程序员必会

    CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本)1. appwiz.cpl:程序和功能 2. calc:启动计算器 3. certmgr. ...

  7. 【css3网页布局】flex盒子模型

    1.0 前言 网页布局(layout)是CSS的一个重点应用. 经典布局类型: 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊 ...

  8. linux下mysql修改root密码

    方法一:用set password命令 首先,登陆mysql mysql -u root -p 然后执行set password命令 set password for root@localhost = ...

  9. 第6章 影响 MySQL Server 性能的相关因素

    前言: 大部分人都一致认为一个数据库应用系统(这里的数据库应用系统概指所有使用数据库的系统)的性能瓶颈最容易出现在数据的操作方面,而数据库应用系统的大部分数据操作都是通过数据库管理软件所提供的相关接口 ...

  10. 你为什么必须(从现在开始就)掌握linux

    写在前面 在我看来,人人都应该学习linux,但这不是本文探讨的重点.本文主要从软件测试人员的角度谈谈学习和掌握linux的重要性.必要性.紧迫性. 另外: 这里所说的linux系统,是unix系统和 ...