Laravel中如何验证不含GET参数的URL并提取主链接?
嘿,我来帮你搞定这个问题!你想要的是只保留URL的主域名部分(比如http://example.com/),不管后面带的GET参数,同时还要解决验证的问题对吧?这里有两种思路,分别对应你的两个需求:
一、直接提取主链接到变量
PHP内置的parse_url()函数可以完美拆解URL的各个组成部分,我们只需要把必要的部分重新拼接起来就行:
// 获取用户输入的URL $inputUrl = $request->input('url'); // 拆解URL为各个组成部分 $parsedUrl = parse_url($inputUrl); // 拼接主链接:先组合协议(scheme)和域名(host) $baseUrl = $parsedUrl['scheme'] . '://' . $parsedUrl['host']; // 如果URL带端口(比如http://example.com:8080),也一并加上 if (isset($parsedUrl['port'])) { $baseUrl .= ':' . $parsedUrl['port']; } // 加上结尾的斜杠,和你示例里的格式保持一致 $baseUrl .= '/';
这样处理后,不管用户输入的是http://example.com/get?d=323&d=323还是其他带参数、路径的URL,都能得到纯净的主域名链接。parse_url()是PHP官方维护的函数,比自己写正则靠谱多了,能处理各种合法URL的边缘情况。
二、自定义验证规则,确保输入是主链接
如果你想在验证环节就直接拒绝带参数、路径的URL,不让不符合要求的输入进入后续逻辑,可以给Laravel自定义一个验证规则:
第一步:注册自定义验证规则
打开app/Providers/AppServiceProvider.php,在boot()方法里添加以下代码:
use Illuminate\Support\Facades\Validator; public function boot() { Validator::extend('base_url', function ($attribute, $value, $parameters, $validator) { $parsed = parse_url($value); // 验证条件:必须有协议和域名,且没有额外路径、查询参数、锚点 return isset($parsed['scheme'], $parsed['host']) && (empty($parsed['path']) || $parsed['path'] === '/') && empty($parsed['query']) && empty($parsed['fragment']); }); // 自定义验证失败时的提示信息 Validator::replacer('base_url', function ($message, $attribute, $parameters) { return '请输入不带参数和路径的主域名链接(比如 http://example.com/)'; }); }
第二步:使用自定义规则验证
现在你就可以在验证逻辑里直接用这个新规则了:
$this->validate($request->all(), [ 'url' => 'required|url|base_url' ]);
这样一来,用户输入带GET参数的URL时,验证就会直接失败,返回你自定义的错误提示。
内容的提问来源于stack exchange,提问作者Jadasdas
相关产品推荐
相关产品推荐

