easygo
Version:
186 lines (167 loc) • 4.89 kB
JavaScript
/**
* @file 字符串操作
* @author cuihonglei(cuihonglei2xj@gmail.com)
*/
module.exports = {
/**
* 获取字符串字节长度
*
* @param {string} source 字符串
* @return {number} 长度
*/
getByteLength: function (source) {
return String(source).replace(/[^\x00-\xff]/g, '11').length;
},
/**
* 解码html字符串
*
* @param {string} source html字符串
* @return {string} 解码后字符串
*/
decodeHTML: function (source) {
var str = String(source)
.replace(/"/g, '"')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/&/g, '&');
// 处理转义的中文和实体字符
return str.replace(/&#((?:\d+)|(?:x[a-f\d]+));/gi, function ($0, $1) {
return String.fromCharCode(Number('0' + $1));
});
},
/**
* 编码html字符串
*
* @param {string} source html字符串
* @return {string} 编码后字符串
*/
encodeHTML: function (source) {
return String(source)
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
},
/**
* javascript 字符串escape
*
* @param {string} source javascript字符串
* @return {string} 编码后字符串
*/
escapeJS: function (source) {
return String(source).replace(/["'\\\n\r\f\b\t\u2028\u2029]/g, function (c) {
switch (c) {
case '"':
case '\'':
case '\\':
return '\\' + c;
case '\n':
return '\\n';
case '\r':
return '\\r';
case '\f':
return '\\f';
case '\b':
return '\\b';
case '\t':
return '\\t';
case '\u2028':
return '\\u2028';
case '\u2029':
return '\\u2029';
}
});
},
/**
* regexp 字符串escape
*
* @param {string} source 字符串
* @return {string} 编码后字符串
*/
escapeRegExp: function (source) {
return String(source).replace(/[|\\{}()[\]^$+*?.]/g, '\\$&');
},
/**
* 按字节截取字符串
*
* @param {string} str 字符串
* @param {number} length 截取长度
* @param {string} tail 加的后缀
* @return {string} 截取后的字符串
*/
cut: function (str, length, tail) {
tail = tail || '';
str = String(str);
var size = 0;
var l = str.length;
for (var i = 0; i < l; i++) {
size += str.charCodeAt(i) > 255 ? 2 : 1;
if (size > length) {
return str.slice(0, i) + tail;
}
}
return str + tail;
},
/**
* 判断字符串开头是否是另一字符串
*
* @param {string} str1 字符串1
* @param {string} str2 字符串2
* @return {boolean} 是否开头
*/
startsWidth: function (str1, str2) {
if (str1 == null || str2 == null || str1.length < str2.length) {
return false;
}
return str1.indexOf(str2) === 0;
},
/**
* 判断字符串结尾是否是另一字符串
*
* @param {string} str1 字符串1
* @param {string} str2 字符串2
* @return {boolean} 是否开头
*/
endsWith: function (str1, str2) {
if (str1 == null || str2 == null || str1.length < str2.length) {
return false;
}
return str1.lastIndexOf(str2) === str1.length - str2.length;
},
/**
* 字符串格式化,支持如 ${xxx.xxx} 的语法
*
* @param {string} source 模板字符串
* @param {Object} data 数据
* @return {string} 格式化后字符串
*/
format: function (source, data) {
return source.replace(/\$\{([\w.]+)\}/g, function ($0, $1) {
var ref = $1.split('.');
var refObject = data;
var level;
while (refObject != null && (level = ref.shift())) {
refObject = refObject[level];
}
return refObject != null ? refObject : '';
});
},
/**
* 获取字符串哈希编码
*
* @param {string} str 字符串
* @return {number} 哈希值
*/
hashcode: function (str) {
if (null == str) {
return 0;
}
str = String(str);
var hash = 0;
for (var i = 0, l = str.length; i < l; i++) {
hash = 0x7FFFFFFFF & (hash * 131 + str.charCodeAt(i));
}
return hash;
}
};