PHP正则验证URL区分域名首页与内页完整路径问题求助
现有代码存在的问题
- 正则仅匹配纯域名字符串,没有兼容
http://、https://协议前缀,也没有处理域名末尾的/字符,导致带协议或者末尾带斜杠的域名被错误判定为全路径URL - 输出语句存在语法错误:
echo "$urls is domain";中$urls是存储所有URL的数组,直接输出会报数组转字符串的警告,应该使用循环变量$url - 没有判断URL是否包含路径、查询参数部分,无法准确区分纯首页域名和带资源路径的内页URL
修复方案
修复思路:先对每个URL做预处理,移除协议前缀,再通过解析URL判断是否存在非根路径、查询参数,匹配规则完全对齐预期输出。
$urls = [ "http://example.com", "https://www.example.net", "http://example.com/page.html?a=123", "http://example.com/page?a=123", "http://example.com/", "https://example.net/", "example.com", "demo.example.net" ]; // 原域名校验正则保留 $domainPattern = '/^(?!\-)(?:(?:[a-zA-Z\d][a-zA-Z\d\-]{0,61})?[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$/'; foreach ($urls as $url) { // 移除协议前缀后提取主机部分 $processedUrl = preg_replace('#^https?://#', '', $url); $host = rtrim(explode('/', $processedUrl, 2)[0], '/'); // 解析URL的路径和查询参数 $path = parse_url($url, PHP_URL_PATH); $query = parse_url($url, PHP_URL_QUERY); if (preg_match($domainPattern, $host) && (empty($path) || $path === '/') && empty($query)) { echo "{$url} (domain)" . PHP_EOL; } else { echo "{$url} (full URL)" . PHP_EOL; } }
运行上述代码即可得到你给出的预期输出结果。
内容的提问来源于stack exchange,提问作者Brajman
相关产品推荐
相关产品推荐

