在Python中验证易读简单URL——离线验证域名
支持无前缀域名的URL验证方案
我之前也碰到过这种头疼的需求——要验证URL,但用户输入的可能是不带http/https甚至www的纯域名,比如example.com,而现有的验证工具要么不支持这种格式,要么限制太死。结合你的需求,我整理了一个Python实现方案,完美适配你列出的允许格式,同时排除那些无效的输入。
核心思路
现有验证工具(比如validators库)需要URL带协议前缀才能正常工作,所以我们的核心步骤是:
- 先对输入做预处理:给没有协议前缀的输入补上
http:// - 用验证工具检查处理后的URL有效性
- 额外做一层过滤,排除像
example(无域名后缀)、乱码字符串这类明显无效的输入
代码实现
首先确保你安装了validators库:
pip install validators
然后是验证函数:
import validators import re def validate_custom_url(input_url): # 第一步:清理输入,去除前后空格 cleaned_url = input_url.strip() if not cleaned_url: return False # 第二步:排除明显无效的输入(比如无点的纯字符串、大量特殊字符) # 检查是否至少包含一个点,且主要部分是合法的域名字符 if '.' not in cleaned_url: return False # 匹配域名的基本规则:字母、数字、点、连字符、下划线,避免乱码 if not re.match(r'^[a-zA-Z0-9.-_]+$', cleaned_url.replace('/', '')): return False # 第三步:给无协议前缀的URL补上http:// if not cleaned_url.startswith(('http://', 'https://')): processed_url = f'http://{cleaned_url}' else: processed_url = cleaned_url # 第四步:用validators验证处理后的URL return validators.url(processed_url) is True
测试示例
我们来测试你列出的允许和不允许的格式:
- 允许的格式测试:
validate_custom_url("http://www.example.berlin")→Truevalidate_custom_url("https://example.de/more")→Truevalidate_custom_url("www.sub.example.de")→Truevalidate_custom_url("example.de")→True
- 不允许的格式测试:
validate_custom_url("example")→False(无域名后缀)validate_custom_url("1 ::::: .....")→False(包含非法特殊字符)
这个函数既满足了无前缀域名的验证需求,又能有效过滤掉明显无效的输入,完全适配你的要求。
内容的提问来源于stack exchange,提问作者oxidworks




