如何修改PHP通配符URL验证正则以支持*example.*格式?
解决PHP正则无法验证
*example.*格式通配符URL的问题 问题背景
现有一段用于验证支持子域名和顶级域名通配符的PHP正则表达式,测试时发现*example.*格式无法通过验证,但其他类似格式(如example.*、*example.com)均可正常验证。
原正则与测试情况
原正则表达式
$wildcardUrlPattern = '/^(https?:\/\/)?(\*[a-z0-9-]*\.)?[a-z0-9-]+(\.[a-z0-9-]*)*(\.\*[a-z0-9-]*)?$/i';
测试代码
// 测试URL列表 $urls = [ 'example.*', // 带通配符顶级域名的域名 '*example.com', // 带通配符域名主体+固定顶级域名 '*.example.*', // 带通配符子域名+通配符顶级域名 '*.example.com', // 带通配符子域名+固定顶级域名 '*example.*', // 带通配符域名主体+通配符顶级域名(原正则无法验证) 'http://example.*', // 带协议+域名+通配符顶级域名 'http://*example.com' // 带协议+通配符域名主体+固定顶级域名 ]; foreach ($urls as $url) { if (preg_match($wildcardUrlPattern, $url)) { echo "$url: 有效的通配符URL\n"; } else { echo "$url: 无效的URL\n"; } }
原测试结果
example.*: 有效的通配符URL *example.com: 有效的通配符URL *.example.*: 有效的通配符URL *.example.com: 有效的通配符URL *example.*: 无效的URL(应该验证通过) http://example.*: 有效的通配符URL http://*example.com: 有效的通配符URL
问题分析
原正则的核心问题在于:第二个分组(\*[a-z0-9-]*\.)?强制要求通配符*后必须紧跟一个点.,但*example.*中*后是域名主体example,没有点,导致该分组无法匹配;而后续的[a-z0-9-]+不允许以*开头,因此整个正则无法覆盖*example.*这种格式。
修改后的正则表达式
调整正则逻辑,允许域名主体直接以*开头,同时兼容原有所有合法格式:
$wildcardUrlPattern = '/^(https?:\/\/)?((\*[a-z0-9-]*\.)?[a-z0-9-]+|\*[a-z0-9-]+)(\.[a-z0-9-]*)*(\.\*[a-z0-9-]*)?$/i';
修改后测试结果
运行原测试代码,所有用例均可正常验证:
example.*: 有效的通配符URL *example.com: 有效的通配符URL *.example.*: 有效的通配符URL *.example.com: 有效的通配符URL *example.*: 有效的通配符URL http://example.*: 有效的通配符URL http://*example.com: 有效的通配符URL
内容的提问来源于stack exchange,提问作者unice
相关产品推荐
相关产品推荐

