Source

str.js

import {isNumber, isString} from "./typer";

/**
 * @description add leading zero if value <10
 * @param {number} value
 * @returns {string}
 */
export function padZero(value) {
    if(!isNumber(value)){
        return "00";
    }
    return value < 10 ? '0' + value : value + '';
}

/**
 * @description value can't includes some values
 * @param {string} value
 * @returns {boolean}
 */
function isNormalStr(value = '') {
    if (value === '') {
        return false;
    }

    let invalidList = [
        void 0,
        new Promise(() => {}),
        () => {},
        function () {},
        null,
        {},
        true,
        false,
    ].map(item => item + '');

    for (let item of invalidList) {
        if (value.includes(item)) {
            return false;
        }
    }

    return true;
}

/**
 * @description check if value is normal event name like 'click.myEvent' with jQuery event name style
 * @param {string} value
 * @returns {boolean}
 */
export function isNormalEventName(value) {
    if (!isString(value)) {
        value = '';
    }
    let valuePair = value.split('.');
    return valuePair.every(item => isNormalStr(item));
}

/**
 * @description a function like css's ellipsis
 * @param {string} text
 * @param {number} maxNum
 * @returns {string}
 */
export function ellipsis(text, maxNum) {
    if (!isString(text)) {
        text = text + '';
    }
    if (!isNumber(maxNum) || isNaN(maxNum)) {
        maxNum = text.length;
    }

    if (text.length > maxNum) {
        return text.substring(0, maxNum) + '...';
    } else {
        return text;
    }
}

/**
 * @description check if the value is json string
 * @param {string} str
 * @returns {boolean}
 */
export function isJSON(str) {
    if (isString(str)) {
        try {
            JSON.parse(str);
            return true;
        } catch (e) {
            return false;
        }
    }
    return false;
}

/**
 * @description compute string length including Chinese and English chars
 * @param {string} str
 * @returns {number}
 */
export function getGbLen(str) {
    if(!isString(str)){
        return 0;
    }
    let len = 0;
    for (let i = 0; i < str.length; i++) {
        if (str.charCodeAt(i) > 127 || str.charCodeAt(i) === 94) {
            len += 2;
        } else {
            len++;
        }
    }
    return len;
}

/**
 * @description slice specified length of string with EN, CN chars
 * @param {string} str
 * @param {number} index
 * @param {boolean} [point=true]
 * @returns {string}
 */
export function subGbStr(str, index, point = true) {
    if (index >= getGbLen(str)) {
        return str;
    }

    let rtStr = '';
    for (let i = 0, count = 0; count < index; i++, count++) {
        rtStr += str[i];
        if (str.charCodeAt(i) > 127 || str.charCodeAt(i) === 94) {
            count++;
        }
    }
    if (point) {
        return rtStr + '...';
    } else {
        return rtStr;
    }
}



/*
 * 判断是否字母
 */
export function isLetter(val) {
	if ((val < 'a' || val > 'z') && (val < 'A' || val > 'Z')) {
		return false;
	}
	
	return true;
};

/*
 * 判断是否中文
 */
export function isChinese(val) {
	if (val < '一' || val > '龥') {
		return false;
	}
	
	return true;
};

export function isIp(ipaddr) {
	if (typeof ipaddr != 'string' || $.trim(ipaddr) == '') {
		return false;
	}
	var ss = ipaddr.split('.');
	if (ss.length != 4) {
		return false;
	}
    for(let e of ss){
        if (!isNumber(e) || parseInt(e) < 0 || parseInt(e) > 255) {
			return true;
		}
    }
    return false;
};

export function isDomain(obj) {
	if (/^[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]$/.test(obj)) {
		if (obj.indexOf('--') >= 0) {
			return false;
		}
		return true;
	} else { 
		return false;
	}
};

export function isWord(word) {
	var pattern = /^[a-zA-Z0-9_]+$/;   
	return pattern.test(word);
};

export function isEmail(email) {
	var pattern = /^[a-zA-Z0-9][a-zA-Z0-9_=\&\-\.\+]*[a-zA-Z0-9]*@[a-zA-Z0-9][a-zA-Z0-9_\-\.]+[a-zA-Z0-9]$/;
	return pattern.test(email);
};

export function isEmailDomain(email) {
	var pattern = /^[a-zA-Z0-9][a-zA-Z0-9_\-]*\.[a-zA-Z0-9\-][a-zA-Z0-9_\-\.]*[a-zA-Z0-9]$/;
	return pattern.test(email);
};

// 校验手机号(针对大陆手机 11位号码,新增对16和19开头的校验)
export function isMobile(mobile) {
	var pattern = /^1[3456789]\d{9}$/;
	return pattern.test(mobile);
};

export function isPhone(phone) {
	var pattern1 = /^([^\d])+([^\d])*([^\d])$/;
	var pattern2 = /^([\d\+\s\(\)-])+([\d\+\s\(\)-])*([\d\+\s\(\)-])$/;
	//var p1 = /^(([0\+]\d{2,3}-)?(0\d{2,3})-)?(\d{7,8})(-(\d{3,}))?$/;
	if (pattern1.test(phone)) {
		return false;
	}
	return pattern2.test(phone);
};

// 校验手机号(海内外)
export function isNationMobile(mobile) {
	var pattern = /^\d{7,11}$/;
	return pattern.test(mobile);
};

//验证身份证号码
export function isCardNo(card) {
	var pattern = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;  
	return pattern.test(card);
};

//supAbsuRoot   是否支持绝对路径
export function isUrl(str_url, supAbsuRoot) {
	if (typeof supAbsuRoot == 'undefined') {
		supAbsuRoot = true;
	}
	if (supAbsuRoot && str_url.length >= 1 && str_url.charAt(0) == '/') {
		return true;
	}
	if (supAbsuRoot && str_url.length >= 1 && str_url.charAt(0) == '#') {
		return true;
	}

	var re = /^(\w+:).+/;
	var result = re.test(str_url);	
	return result;
};