要验证一个字符串是否符合域名格式,需满足以下规则:

-
域名结构:
- 由多个标签(Label)组成,标签间用点()分隔。
- 标签数量至少为1(如
localhost是有效的)。 - 标签不能为空(如
.com或example.无效)。
-
标签规则:

- 长度:每个标签长度在 1 到 63 个字符之间。
- 字符集:仅允许字母(a-z, A-Z)、数字(0-9)和连字符(-)。
- 起始/结束字符:标签不能以连字符开头或结尾(如
-abc或abc-无效)。
-
总长度:
整个域名(包括分隔符点)总长度不超过 255 个字符。

实现代码(Python)
def is_valid_domain(domain: str) -> bool:
# 检查总长度
if len(domain) > 255:
return False
# 分割标签
labels = domain.split('.')
# 检查标签数量(至少1个)
if len(labels) == 0:
return False
for label in labels:
n = len(label)
# 标签长度检查 (1-63)
if n == 0 or n > 63:
return False
# 标签首尾不能是连字符
if label.startswith('-') or label.endswith('-'):
return False
# 字符合法性检查
for char in label:
if not (char.isalnum() or char == '-'):
return False
return True
测试用例
| 域名示例 | 是否有效 | 原因 |
|---|---|---|
"example.com" |
符合所有规则 | |
"localhost" |
单标签有效 | |
"sub.domain.org" |
多标签有效 | |
"a-b.c0m" |
允许连字符和数字 | |
| 空域名无效 | ||
".com" |
空标签无效 | |
"example..com" |
连续点导致空标签 | |
"-invalid.com" |
标签以连字符开头 | |
"invalid-.com" |
标签以连字符结尾 | |
"in valid.com" |
包含空格(非法字符) | |
"toolonglabel."*64 |
标签长度超过63字符 | |
"a"*255 |
总长度等于255有效 | |
"a"*256 |
总长度超过255无效 | |
"ünicode.com" |
非ASCII字符(需IDN编码处理) |
关键点说明
- 国际化域名(IDN):上述代码仅支持ASCII字符,如需支持非ASCII字符(如中文、阿拉伯语),需先将域名转换为Punycode(如
"中国.cn"→"xn--fiqs8s.cn")再验证。 - 大小写处理:域名不区分大小写(
EXAMPLE.COM与example.com等价),验证时无需额外转换。 - 特殊用途域名:如
localhost、.test等保留域名,格式上有效,但实际使用需遵循特定规范。
此方案严格遵循ICANN域名格式标准,可直接用于基础域名格式校验。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/285604.html

