-
Notifications
You must be signed in to change notification settings - Fork 0
/
string.js
282 lines (246 loc) · 8.25 KB
/
string.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
/*
字符串操作
Thanks:https://github.com/zenxds/CodeHeap/blob/master/js/str.js
*/
// 可以使用 \x 加 2位16进制字符标记一个单字节的字符
// 例如字符 'a' 可以表示为 \x61,用法类似\u 加4位16进制编码。
// \u 加四位十六进制数 或 \x 加2位十六进制数属于转义字符,在 js 字符串长度中只算 1 个
// \ 开始后接正数,可能被解析为8进制转义字符
// 一个八进制转义字符形成的条件是:斜线后面接的整数最长3位,至少1位,单个数字的字面值不大于8。
// 八进制转义字符的10进制数字字面值最大值为377(即10进制的255),即 '\377' 被解析为一个字符,'\378' 被解析为2个字符: '\37' 和 '8'
// 字节长度
// 默认一个汉字占2字节
// 但可以定制
// 比如mysql存储时使用的是3个字节
/**
* [genRandomId description] 生成随机ID
* @param len {Number} 需要生成的ID的长度
* @return {String} 生成的随机字符串ID
*/
function genRandomId(len){
return Math.random().toString(36).substr(3, len);
}
/**
* [getStringLength description] 求得计算机学上的字符串长度
* @param str {String} 字符串
* @param fix {Number} 修正,一个汉字占几个字节
* @return {Number} 返回计算机学上的字符串长度
*/
function getStringLength(str, fix) {
var fixNow = fix || 2;
return String(str).replace(/[^\x00-\xff]/g, new Array(fixNow + 1).join("-")).length;
}
/**
* [toAscii description] 将字符串转换成Ascii码形式,主要是对中文的转换
* @param str {String} 字符串
* @return {Number} 返回Ascii码形式的字符串
*/
function toAscii(str) {
return str.replace(/[\u0080-\uffff]/g, function (ch){
var code = ch.charCodeAt(0).toString(16);
if (code.length <= 2) {
while (code.length < 2) code = "0" + code;
return "\\x" + code;
} else {
while (code.length < 4) code = "0" + code;
return "\\u" + code;
}
})
}
/**
* [byteCount description] 返回UTF-8字符串的字节大小
* @param str {String} 字符串
* @return {Number} 返回字节大小,即转换成Ascii码之后的字节大小
*/
function byteCount(str) {
return encodeURI(str).split(/%..|./).length - 1;
}
/**
* [truncate description] 字符串截断,超出部分用省略号代替
* @param str {String} 字符串
* @param length {Number} 最大长度
* @param truncation {String} 代替部分
* @return {String} 返回替换之后的字符串
*/
function truncate(str, length, truncation) {
length = length || 30;
truncation = truncation || "...";
return str.length > length ? str.slice(0, length - truncation.length) + truncation : str;
}
/**
* [trim description] 清除字符串两端的空白字符
* @param str {String} 目标字符串
* @return {String} 处理之后的字符串
*/
function trim(str) {
return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}
/**
* [pad description] 与 trim 相反, pad 可以为字符串的某一端添加字符串。如pad("Merrier",9) -> 00Merrier
* @param target {String} 目标字符串
* @param n {Number} 目标长度
* @return {String} 返回截取之后的字符串
*/
function pad(target, n) {
var zero = new Array(n).join('0');
var str = zero + target;
return str.substr(-n); //-n表示由右边起第n位开始截取
}
/**
* [stripHTMLTags description] 去除字符串中的html标签
* @param str {String} 字符串
* @return {String} 返回去除html标签之后的字符串
*/
function stripHTMLTags(str) {
return (str + '').replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<').replace(/>/g, '>');
}
/**
* [stripScripts description] 去除字符串中的script代码
* @param str {String} 字符串
* @return {String} 返回去除script代码之后的字符串
*/
function stripScripts(str) {
return (str + "").replace(/<script[^>]*>([\S\s]*?)<\/script>/img, "");
}
/**
* [stripScripts description] 把字符串转为安全的正则源码,文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
* @param str {String} 字符串
* @return {String} 返回安全的正则源码
*/
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
/**
* [addQuote description] 在字符串两端添加双引号,然后内部需要转义的地方都要转义,用于接装 JSON的键名或模析系统中,感谢:http://code.google.com/p/jquery-json/
* @param target {String} 目标字符串
* @return {String} 返回转义之后的字符串
*/
function addQuote(target) {
var escapeable = /["\\\x00-\x1f\x7f-\x9f]/g, //需要转义的非法字符
meta = {
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'"': '\\"',
'\\': '\\\\'
};
if (target.match(escapeable)) {
return '"' + target.replace(escapeable, function(a) {
var c = meta[a];
if (typeof c === 'string') {
return c;
}
return '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4)
}) + '"';
}
return '"' + target + '"';
}
/**
* [genRandomString description] 生成固定长度的随机字符串
* @param length {Number} 字符串长度
* @return {String} 返回随机字符串
*/
function genRandomString(length) {
var str = '';
while (str.length < length) {
str += Math.random().toString(36).slice(2);
}
return str.substr(0, length);
}
/**
* [ucfirst description] 首字母大写
* @param str {String} 原字符串
* @return {String} 返回新字符串
*/
function ucfirst(str) {
return str.charAt(0).toUpperCase() + str.substring(1);
}
/**
* [toHump description] 字符串转成驼峰格式
* @return {String} 驼峰格式的字符串
*/
function toHump(str) {
return str[0].toUpperCase() + str.slice(1).toLowerCase();
}
/**
* [reverse description] 字符串反序输出
* @param str {String} 原字符串
* @return {String} 反序之后的字符串
*/
function reverse(str){
return str.split('').reverse().join('');
}
/**
* [isStartsWith description] 判断是否以给定字符串开始
* @param str {String} 字符串
* @param prefix {String} 前缀
* @return {Boolean} 返回判断结果
*/
function isStartsWith(str, prefix) {
return str.lastIndexOf(prefix, 0) === 0;
}
/**
* [isEndsWith description] 判断是否以给定字符串结尾
* @param str {String} 字符串
* @param suffix {String} 后缀
* @return {Boolean} 返回判断结果
*/
function isEndsWith(str, suffix) {
var index = str.length - suffix.length;
return index >= 0 && str.indexOf(suffix, index) === index;
}
/**
* [isContains description] 判断一个字符串是否包含另外一个字符串
* @param target {String} 目标字符串
* @param str {String} 父字符串
* @param separator {String} 分隔符
* @return {Boolean} 返回判断结果
*/
function isContains(target, str, separator) {
return separator ?
(separator + target + separator).indexOf(separator + str + separator) > -1 : //需要判断分隔符
target.indexOf(str) > -1; //不需判断分隔符
}
/**
* [repeat description] 将一个字符串重复自身N次,如 repeat("Ha")得到HaHa。
* @param target {String} 目标字符串
* @param n {String} 重复次数
* @return {String} 重复之后的字符串
*/
function repeat(target, n) {
var s = target,
total = "";
while (n > 0) {
if (n % 2 === 1)
total += s;
if (n === 1)
break;
s += s;
n = n >> 1; // >>是右移位运算符,相当于将n除以2取其商,或说开二次方
}
return total;
}
/**
* [escapeHTML description] 将字符串经过html转义得到适合在页面中显示的内容,如将 < 替换为 <
* @param target {String} 目标字符串
* @return {String} 转义之后的字符串
*/
function escapeHTML(target) {
return target.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, """)
.replace(/'/g, "'");
}
/**
* [replaceAll description] 替换全部给定字符串
* @param str {String} 原字符串
* @param s1 {String} 需要替换掉的字符串
* @param s2 {String} 用于替换的字符串
* @return {String} 替换之后的字符串
*/
function replaceAll(str, s1, s2){
return str.replace(new RegExp(s1, "gm"), s2);
}