Laravel中禁止社交账号输入框填URL?自定义验证规则失效
解决Laravel中验证输入框禁止填写URL的问题
嘿,我之前也踩过这个坑——Laravel默认的验证规则里并没有not:url这种直接的否定语法,所以你的规则没生效是正常的。下面给你几个实用的解决办法,按从快到优雅的顺序排列:
方法一:用正则表达式快速实现
这是最直接的方式,用负向前瞻正则来确保输入内容不包含URL格式的字符串。代码如下:
$this->validate($request, [ 'google_plus' => 'required|regex:/^((?!https?:\/\/).)*$/i', 'twitter' => 'required|regex:/^((?!https?:\/\/).)*$/i', ]);
正则说明:
(?!https?:\/\/):负向前瞻断言,确保字符串中不存在http://或https://(s?表示s可选,兼容http和https).*:匹配任意字符(除换行外)/i:不区分大小写,避免用户输入HTTP://绕过验证
如果需要更严格地禁止所有域名(比如不带http的google.com),可以把正则调整为更全面的域名匹配规则,不过大多数场景下上面的正则已经够用了。
方法二:自定义验证规则(适合复用)
如果这个“禁止URL”的验证逻辑要在多个地方使用,自定义规则会更优雅,也方便维护:
- 首先生成自定义规则文件:
php artisan make:rule NotUrl
- 打开
app/Rules/NotUrl.php,编写验证逻辑:
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class NotUrl implements Rule { /** * 判断验证是否通过 * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value) { // 复用Laravel自带的url验证规则,取反结果即可 return !\Illuminate\Validation\Rule::url()->passes($attribute, $value); } /** * 获取验证错误消息 * * @return string */ public function message() { return 'The :attribute must not be a URL.'; } }
- 在控制器中引入并使用这个规则:
use App\Rules\NotUrl; // ... $this->validate($request, [ 'google_plus' => ['required', new NotUrl], 'twitter' => ['required', new NotUrl], ]);
额外提示
如果你的需求是“只允许填写社交账号的用户名”,还可以结合alpha_dash或其他规则进一步限制输入格式,比如只允许字母、数字、下划线和短横线:
'google_plus' => 'required|alpha_dash|regex:/^((?!https?:\/\/).)*$/i',
内容的提问来源于stack exchange,提问作者Jadasdas
相关产品推荐
相关产品推荐

