init
This commit is contained in:
90
uni_modules/lime-shared/isValidDomain/index.ts
Normal file
90
uni_modules/lime-shared/isValidDomain/index.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
// @ts-nocheck
|
||||
/**
|
||||
* 域名验证配置选项
|
||||
*/
|
||||
export type IsValidDomainOptions = {
|
||||
/**
|
||||
* 是否要求必须包含顶级域名(TLD)
|
||||
* @default true
|
||||
* @example
|
||||
* true -> "example.com" 有效
|
||||
* false -> "localhost" 有效
|
||||
*/
|
||||
requireTld : boolean;
|
||||
|
||||
/**
|
||||
* 是否允许域名部分包含下划线(_)
|
||||
* @default false
|
||||
* @example
|
||||
* true -> "my_site.com" 有效
|
||||
* false -> "my_site.com" 无效
|
||||
*/
|
||||
allowUnderscore : boolean;
|
||||
|
||||
/**
|
||||
* 是否允许域名以点号(.)结尾
|
||||
* @default false
|
||||
* @example
|
||||
* true -> "example.com." 有效
|
||||
* false -> "example.com." 无效
|
||||
*/
|
||||
allowTrailingDot : boolean;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 验证字符串是否为合法域名
|
||||
* @param str 要验证的字符串
|
||||
* @param options 配置选项,默认 {
|
||||
* requireTld: true, // 需要顶级域名
|
||||
* allowUnderscore: false,// 允许下划线
|
||||
* allowTrailingDot: false// 允许结尾点号
|
||||
* }
|
||||
* @returns 验证结果
|
||||
*
|
||||
* 示例:
|
||||
* isValidDomain("example.com") // true
|
||||
* isValidDomain("my_site.com", { allowUnderscore: true }) // true
|
||||
*/
|
||||
export function isValidDomain(
|
||||
str : string,
|
||||
options : IsValidDomainOptions = {
|
||||
requireTld: true,
|
||||
allowUnderscore: false,
|
||||
allowTrailingDot: false
|
||||
}
|
||||
) : boolean {
|
||||
// 预处理字符串
|
||||
let domain = str;
|
||||
|
||||
// 处理结尾点号
|
||||
if (options.allowTrailingDot && domain.endsWith('.')) {
|
||||
domain = domain.slice(0, -1);
|
||||
}
|
||||
|
||||
// 分割域名部分
|
||||
const parts = domain.split('.');
|
||||
if (parts.length == 1 && options.requireTld) return false;
|
||||
|
||||
// 验证顶级域名
|
||||
const tld = parts[parts.length - 1];
|
||||
if (options.requireTld) {
|
||||
if (!/^[a-z\u00A1-\uFFFF]{2,}$/i.test(tld) || /\s/.test(tld)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// 验证每个部分
|
||||
const domainRegex = options.allowUnderscore
|
||||
? /^[a-z0-9\u00A1-\uFFFF](?:[a-z0-9-\u00A1-\uFFFF_]*[a-z0-9\u00A1-\uFFFF])?$/i
|
||||
: /^[a-z0-9\u00A1-\uFFFF](?:[a-z0-9-\u00A1-\uFFFF]*[a-z0-9\u00A1-\uFFFF])?$/i;
|
||||
|
||||
return parts.every(part => {
|
||||
// 长度校验
|
||||
if (part.length > 63) return false;
|
||||
// 格式校验
|
||||
if (!domainRegex.test(part)) return false;
|
||||
// 禁止开头/结尾连字符
|
||||
return !(part.startsWith('-') || part.endsWith('-'));
|
||||
});
|
||||
}
|
Reference in New Issue
Block a user