/** * 对长字符串截短,以字符长度截取,中文占两字符;{{str|truncatex(4,'...')}} * @param str * @param length,新字符串长度(按照英文字符算,一个中文占两字符),包含truncation的字符个数 * @param truncation,新字符串的结尾的字段 * @returns {返回新字符串} */ avalon.filters.truncatex = function (str, length, truncation) { var chinese_pattern = /[u4E00-u9FA5]|[uFE30-uFFA0]/gi; // [u4E00-u9FA5]表示汉字,[uFE30-uFFA0]表示全角 str = str || " "; length = length || 30; truncation = typeof truncation === "string" ? truncation : "..."; var chineseIn = function (s) { return chinese_pattern.exec(s) ? true : false; }; var calcSize = function (source) { var strTemp = source.replace(chinese_pattern, "aa"); return strTemp.length; }; var recursion = function (source, length) { if (calcSize(source) <= length || (!chineseIn(source))) { return source; } else { return recursion(source.slice(0, source.length - 1), length); } }; var sliceLength = length - truncation.length; return calcSize(str) > length ? recursion(str.slice(0, sliceLength), sliceLength) + truncation : String(str); };