123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- /**
- * 字符串类
- */
- export class StringManager {
- constructor() {}
- /**
- * 获取uuid
- * @param {Number} len uuid的长度
- * @param {Boolean} first 默认的首字母
- * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制
- */
- uuid = (len = 32, first = "", radix = null) => {
- const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
- const uuid = []
- radix = radix || chars.length
- if (len) {
- // 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位
- for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]
- } else {
- let r
- // rfc4122标准要求返回的uuid中,某些位为固定的字符
- uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
- uuid[14] = '4'
- for (let i = 0; i < 36; i++) {
- if (!uuid[i]) {
- r = 0 | Math.random() * 16
- uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]
- }
- }
- }
- // 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class
- if (first != "") {
- uuid.shift()
- return `${first}${uuid.join('')}`
- }
- return uuid.join('')
- }
- /**
- * @description 去除空格
- * @param String str 需要去除空格的字符串
- * @param String pos both(左右)|left|right|all 默认both
- */
- trim = (str, pos = 'both') => {
- str = String(str)
- if (pos == 'both') {
- return str.replace(/^\s+|\s+$/g, '')
- }
- if (pos == 'left') {
- return str.replace(/^\s*/, '')
- }
- if (pos == 'right') {
- return str.replace(/(\s*$)/g, '')
- }
- if (pos == 'all') {
- return str.replace(/\s+/g, '')
- }
- return str
- }
- /**
- * 验证字符串
- */
- isString = (str) => {
- return typeof str === 'string'
- }
- /**
- * 验证是否包含某个值
- */
- isContains = (str1, str2) => {
- return str1.indexOf(str2) >= 0
- }
- /**
- * 是否json字符串
- */
- isJsonString = (str) => {
- if (typeof str === 'string') {
- try {
- const obj = JSON.parse(str)
- if (typeof obj === 'object' && obj) {
- return true
- }
- return false
- } catch (e) {
- return false
- }
- }
- return false
- }
- /**
- * 字节格式化
- */
- sizeFormat = (size) => {
- if (size < 1024) {
- return size + 'B';
- } else if (size < (1024 * 1024)) {
- var temp = size / 1024;
- temp = temp.toFixed(2);
- return temp + 'KB';
- } else if (size < (1024 * 1024 * 1024)) {
- var temp = size / (1024 * 1024);
- temp = temp.toFixed(2);
- return temp + 'MB';
- } else {
- var temp = size / (1024 * 1024 * 1024);
- temp = temp.toFixed(2);
- return temp + 'GB';
- }
- }
- /**参数说明:
- * 根据长度截取先使用字符串,超长部分追加…
- * str 对象字符串
- * len 目标字节长度
- * 返回值: 处理结果字符串
- */
- substring = (str, len = 10, end = "...") => {
- if (str) {
- if (str.length <= len) {
- return str;
- }
- let strlen = 0;
- let s = "";
- for (let i = 0; i < str.length; i++) {
- s = s + str.charAt(i);
- strlen = strlen + 1;
- if (strlen > len) {
- return s.substring(0, s.length - 1) + end;
- }
- }
- return s;
- } else {
- return '';
- }
- }
- /**
- * 隐藏字符
- * @param str 原始字符串
- * @param starCount 显示隐藏字符的个数
- * @param prevCount 开始显示的字符串个数
- * @param endCount 结束显示的字符串个数
- */
- hideString = (str, starCount = 4, prevCount = 3, endCount = 4) => {
- if (!str) {
- return "";
- }
- if (str <= prevCount || str.length <= (prevCount + endCount)) {
- return str;
- }
- let starStr = "******************************";
- let startStr = str.substr(0, prevCount);
- let endStr = str.substr(str.length - endCount, endCount);
- return startStr + starStr.substr(0, starCount) + endStr;
- }
- /**
- * 字符串反转
- */
- reverse(str) {
- return str.split('').reverse().join('');
- }
- /**
- * 随机字符串
- * @param length 生成的长度
- * @param num 是否包含数字
- * @param lowerLetters 是否包含小写字母
- * @param upperLetters 是否包含大写字母
- * @param specialCharacters 是否包含特殊字符
- */
- random = (length, num = true, lowerLetters = true, upperLetters = true, specialCharacters = true) => {
- // 数字
- let numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
- // 小写字母
- let lowers = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
- // 大写字母
- let uppers = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
- // 特殊字符
- let specials = ['#', '!', '@', '$', '%', '^', '&'];
- // 可用的字符集合
- let values = [];
- if (num) {
- values = values.concat(numbers);
- }
- if (lowerLetters) {
- values = values.concat(lowers);
- }
- if (upperLetters) {
- values = values.concat(uppers);
- }
- if (specialCharacters) {
- values = values.concat(specials);
- }
- // 返回值
- let returnArr = [];
- if (length > 0) {
- for (let i = 0; i < length; i++) {
- // 去除一个随机值
- let index = Math.floor(Math.random() * values.length);
- returnArr.push(values[index]);
- }
- }
- return returnArr.join("");
- }
- /**
- * 转大写
- */
- toUpper = (str) => {
- if (this.isString(str)) {
- return str.toUpperCase()
- }
- return str;
- }
- /**
- * 转小写
- */
- toLower = (str) => {
- if (this.isString(str)) {
- return str.toLowerCase()
- }
- return str;
- }
- /**
- * 下划线转驼峰
- */
- underlineToHump = (str) => {
- return str.replace(/\_(\w)/g, function(all, letter) {
- return letter.toUpperCase();
- });
- }
- /**
- * 驼峰转下划线
- */
- humpToUnderline = (str) => {
- return str.replace(/([A-Z])/g, "_$1").toLowerCase();
- }
- /**
- *@param {string} url 完整的URL地址
- *@returns {object} 自定义的对象
- *@description 用法示例:var myURL = parseURL('http://abc.com:8080/dir/index.html?id=255&m=hello#top');
- myURL.file='index.html'
- myURL.hash= 'top'
- myURL.host= 'abc.com'
- myURL.query= '?id=255&m=hello'
- myURL.params= Object = { id: 255, m: hello }
- myURL.path= '/dir/index.html'
- myURL.segments= Array = ['dir', 'index.html']
- myURL.port= '8080'
- myURL.protocol= 'http'
- myURL.source= 'http://abc.com:8080/dir/index.html?id=255&m=hello#top'
- */
- parseUrl = (url) => {
- var a = document.createElement('a');
- a.href = url;
- return {
- source: url,
- protocol: a.protocol.replace(':', ''),
- host: a.hostname,
- port: a.port,
- query: a.search,
- params: (function() {
- var ret = {},
- seg = a.search.replace(/^\?/, '').split('&'),
- len = seg.length,
- i = 0,
- s;
- for (; i < len; i++) {
- if (!seg[i]) {
- continue;
- }
- s = seg[i].split('=');
- ret[s[0]] = s[1];
- }
- return ret;
- })(),
- file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
- hash: a.hash.replace('#', ''),
- path: a.pathname.replace(/^([^\/])/, '/$1'),
- relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
- segments: a.pathname.replace(/^\//, '').split('/')
- };
- }
- /**
- * 将字符串转换为16进制
- */
- stringToHex = (str, isUrlEncode = true) => {
- let val = "";
- if (isUrlEncode) {
- // 如果包含特殊字符或中文先转换
- str = encodeURIComponent(str);
- }
- for (let i = 0; i < str.length; i++) {
- val += str.charCodeAt(i).toString(16);
- }
- return val;
- }
- /**
- * 十六进制转换为字符串
- * @param {*} str
- */
- hexToString = (str, isUrlDecode = true) => {
- var val = "",
- len = str.length / 2;
- for (var i = 0; i < len; i++) {
- val += String.fromCharCode(parseInt(str.substr(i * 2, 2), 16));
- }
- if (!isUrlDecode) {
- return val;
- }
- // 转换结果
- return decodeURIComponent(val);
- }
- }
|