hy-app
Version:
fix: 修复text和tag换掉
172 lines (154 loc) • 4.97 kB
text/typescript
/**
* @description 判断字符串是否是数字
* @param {String | Number} text 值
* @return {Boolean}
* */
export const isNumericString = (text: string | number): boolean => {
return typeof text === "string" && !isNaN(Number(text));
};
/**
* @description 判断是否是数字
* @param {String | Number} text 值
* @return {Boolean}
* */
export const isNumber = (text: string | number): boolean => {
return typeof text === "number" || isNumericString(text);
};
/**
* @description 判断是否数组
* @param {any} arr 传入数组值
* @return {Boolean}
*/
export const isArray = (arr: any): arr is Array<any> => {
// 如果 Array.isArray 函数可用,直接使用该函数检查
if (typeof Array.isArray === "function") {
return Array.isArray(arr);
}
// 否则,使用对象原型的 toString 方法进行检查
return Object.prototype.toString.call(arr) === "[object Array]";
};
/**
* @description 判断是否对象
* @param obj 传入对象值
* @return {Boolean}
*/
export const isObject = (obj: any): obj is Object => {
return Object.prototype.toString.call(obj) === "[object Object]";
};
/**
* @description 是否为base64图片
* @param {String} url
* @return
*/
export function isBase64Image(url: string) {
// 使用正则表达式检查URL是否以"data:image"开头,这是Base64图片的常见前缀
return /^data:image\/(png|jpg|jpeg|gif|bmp);base64,/.test(url);
}
/**
* @description 是否图片
* @param {String} url
* @return
*/
export function isImage(url: string) {
// 使用正则表达式检查URL是否以"data:image"开头,这是Base64图片的常见前缀
return /(\.jpg|\.jpeg|\.png|\.gif|\.bmp|\.webp)$/i.test(url);
}
/**
* 是否视频格式
* @param {String} value
*/
export function isVideo(value: string): boolean {
const VIDEO_REGEXP =
/\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i;
return VIDEO_REGEXP.test(value);
}
/**
* 判断是否是日期格式
* @param {Number | String} value yyyy-mm-dd hh:mm:ss 或 时间戳
*/
export const isDate = (value: string | number) => {
if (!value) return false;
// number类型,判断是否是时间戳
if (typeof value === "number") {
// len === 10 秒级时间戳 len === 13 毫秒级时间戳
if (value.toString().length !== 10 && value.toString().length !== 13) {
return false;
}
return !isNaN(new Date(value).getTime());
}
if (typeof value === "string") {
// 是否为string类型时间戳
const numV = Number(value);
if (!isNaN(numV)) {
if (numV.toString().length === 10 || numV.toString().length === 13) {
return !isNaN(new Date(numV).getTime());
}
}
// 非时间戳,且长度在yyyy-mm-dd 至 yyyy-mm-dd hh:mm:ss 之间
if (value.length < 10 || value.length > 19) {
return false;
}
const dateRegex = /^\d{4}[-\/]\d{2}[-\/]\d{2}( \d{1,2}:\d{2}(:\d{2})?)?$/;
if (!dateRegex.test(value)) {
return false;
}
// 检查是否为有效日期
const dateValue = new Date(value);
return !isNaN(dateValue.getTime());
}
// 非number和string类型,不做校验
return false;
};
/**
* @description 验证是否是手机号格式
* @param {unknown} phone 手机号
*/
export const isPhone = (phone: unknown): boolean => {
if (typeof phone !== "string" && typeof phone !== "number") return false;
if (phone === "") return false;
const phoneStr = String(phone).trim();
// 处理 +86 12345678901 格式
const normalized = phoneStr.replace(/^\+86\s?/, "");
return /^1[3-9]\d{9}$/.test(normalized) && normalized.length === 11;
};
/**
* @description 验证身份证号码
* @param {unknown} idCard 身份证号
* @return {Boolean}
*/
export const isIdCard = (idCard: unknown): boolean => {
if (typeof idCard !== "string" && typeof idCard !== "number") return false;
const str = String(idCard).trim().toUpperCase();
// 格式校验:15位或18位
if (!/(^\d{15}$)|(^\d{17}[\dX]$)/.test(str)) return false;
// 18位身份证:校验校验码
if (str.length === 18) {
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const checksums = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"];
let sum = 0;
for (let i = 0; i < 17; i++) {
sum += parseInt(str[i]) * weights[i];
}
return checksums[sum % 11] === str[17];
}
return true; // 15位不校验
};
/**
* @description 验证是否是中文
* @param {String} zh 校验值
* @return {Boolean}
*/
export const isChinese = (zh: string): boolean => {
const reg = /^[\u4e00-\u9fa5]+$/gi;
return reg.test(zh);
};
/**
* @description 判断环境是否是H5
*/
export const isH5 = (() => {
let isH5 = false;
// #ifdef H5
isH5 = true;
// #endif
return isH5;
})();