smart-bid-web/src/utils/validate.js

207 lines
5.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 路径匹配器
* @param {string} pattern
* @param {string} path
* @returns {Boolean}
*/
export function isPathMatch(pattern, path) {
const regexPattern = pattern
.replace(/\//g, '\\/')
.replace(/\*\*/g, '.*')
.replace(/\*/g, '[^\\/]*')
const regex = new RegExp(`^${regexPattern}$`)
return regex.test(path)
}
/**
* 判断value字符串是否为空
* @param {string} value
* @returns {Boolean}
*/
export function isEmpty(value) {
if (
value == null ||
value == '' ||
value == undefined ||
value == 'undefined'
) {
return true
}
return false
}
/**
* 判断url是否是http或https
* @param {string} url
* @returns {Boolean}
*/
export function isHttp(url) {
return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
}
/**
* 判断path是否为外链
* @param {string} path
* @returns {Boolean}
*/
export function isExternal(path) {
return /^(https?:|mailto:|tel:)/.test(path)
}
/**
* @param {string} str
* @returns {Boolean}
*/
export function validUsername(str) {
const valid_map = ['admin', 'editor']
return valid_map.indexOf(str.trim()) >= 0
}
/**
* @param {string} url
* @returns {Boolean}
*/
export function validURL(url) {
const reg =
/^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
return reg.test(url)
}
/**
* @param {string} str
* @returns {Boolean}
*/
export function validLowerCase(str) {
const reg = /^[a-z]+$/
return reg.test(str)
}
/**
* @param {string} str
* @returns {Boolean}
*/
export function validUpperCase(str) {
const reg = /^[A-Z]+$/
return reg.test(str)
}
/**
* @param {string} str
* @returns {Boolean}
*/
export function validAlphabets(str) {
const reg = /^[A-Za-z]+$/
return reg.test(str)
}
/**
* @param {string} email
* @returns {Boolean}
*/
export function validEmail(email) {
const reg =
/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@(([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
return reg.test(email)
}
/**
* 中国大陆手机号校验
* 规则:可选国家码(+86/0086/86),以 1 开头的 11 位号码,号段 1[3-9]
* @param {string|number} mobile
* @returns {Boolean}
*/
export function validMobile(mobile) {
const value = String(mobile || '').trim()
const reg = /^(?:(?:\+|00)?86)?1[3-9]\d{9}$/
return reg.test(value)
}
/* 身份证号校验 */
export function validIdCard(idCard) {
const value = String(idCard || '').trim()
// 基础格式15位或18位最后一位可以是数字或X
const reg = /(^\d{15}$)|(^\d{17}(\d|X|x)$)/
return reg.test(value)
}
/**
* @param {string} str
* @returns {Boolean}
*/
export function isString(str) {
return typeof str === 'string' || str instanceof String
}
/**
* @param {Array} arg
* @returns {Boolean}
*/
export function isArray(arg) {
if (typeof Array.isArray === 'undefined') {
return Object.prototype.toString.call(arg) === '[object Array]'
}
return Array.isArray(arg)
}
/**
* 判断是否为合法的 IPv4 地址
* @param {string} ip
* @returns {Boolean}
*/
export function isIPv4(ip) {
if (typeof ip !== 'string') return false
// 基础格式校验:四段数字
const parts = ip.split('.')
if (parts.length !== 4) return false
for (let i = 0; i < parts.length; i++) {
const seg = parts[i]
// 不能为空,必须为数字,不能有前导零(允许单个0)
if (seg === '' || /\D/.test(seg)) return false
if (seg.length > 1 && seg[0] === '0') return false
const n = Number(seg)
if (n < 0 || n > 255) return false
}
return true
}
/**
* 将 IPv4 地址转换为 32 位整数(仅内部使用,入参须先通过 isIPv4
* @param {string} ip
* @returns {number}
*/
function ipv4ToInt(ip) {
const [a, b, c, d] = ip.split('.').map(Number)
return ((a << 24) >>> 0) + (b << 16) + (c << 8) + d
}
/**
* 判断起始 IP 是否小于等于结束 IP均为 IPv4
* @param {string} start
* @param {string} end
* @returns {Boolean}
*/
export function isIPv4RangeOrder(start, end) {
if (!isIPv4(start) || !isIPv4(end)) return false
return ipv4ToInt(start) <= ipv4ToInt(end)
}
/**
* 统一安全校验方法
* 使用方法validSecurity(str) 返回 true/false
*/
/**
* 统一安全校验方法
* 使用方法validSecurity(str) 返回 true/false
*/
export function validSecurity(str) {
if (!str || typeof str !== 'string') {
return true;
}
// 将所有正则模式合并为一个统一的正则表达式
const securityRegex = /<script>(.*?)<\/script>|src[\r\n]*=[\r\n]*'(.*?)'|src[\r\n]*=[\r\n]*"(.*?)"|<\/script>|<script(.*?)>|eval\((.*?)\)|e-xpression\((.*?)\)|javascript:|vbscript:|onload(.*?)=|onerror(.*?)=|onclick(.*?)=|onmouseover(.*?)=|alert\((.*?)\)|<.*>|\[.*\]|\(.*\)|'.*'|".*"|%3c|%3e|%2f|%27|%22|%2b|%3b|%28|%29|%5b|%5d|@.*|!.*|%.*|\\x3c|\\x3e|\\x2f|\\x27|\\x22|data:text\/html|base64|document\.|window\.|location\.|cookie|--|\/\*.*?\*\/|#|'|"|\bselect\b|\binsert\b|\bupdate\b|\bdelete\b|\bdrop\b|\btruncate\b|\balter\b|\bcreate\b|\bexec\b|\bexecute\b|\bdeclare\b|\bxp_cmdshell\b|\bsp_\w+\b|\bchar\b|\bascii\b|\bsubstr\b|\bsubstring\b|\bconcat\b|\bmaster\b|\bsys\b|\binformation_schema\b|\bunion\b|\binto\b|\bfrom\b|\bwhere\b|\band\b|\bor\b/i;
return !securityRegex.test(str);
}