Laravel中如何禁止社交账号输入框填URL?自定义验证规则失效
解决Laravel社交账号输入框禁止链接的验证问题
看起来你尝试用自定义的not:url规则没生效,这大概率是因为Laravel本身没有内置这个规则,而且你也没正确注册自定义规则对吧?别担心,我给你两个靠谱的解决方案:
方案一:直接使用正则表达式验证(快速实现)
不用折腾自定义规则,直接用regex和not_regex组合来限制输入:
$this->validate($request, [ 'google_plus' => 'required|regex:/^[a-zA-Z0-9_.]+$/|not_regex:/(http(s)?:\/\/|www\.)/', 'twitter' => 'required|regex:/^[a-zA-Z0-9_.]+$/|not_regex:/(http(s)?:\/\/|www\.)/', ]);
regex:/^[a-zA-Z0-9_.]+$/:限制输入只能是字母、数字、下划线和点号,适配大多数社交平台的登录名格式not_regex:/(http(s)?:\/\/|www\.)/:明确排除含链接前缀的内容,直接拒绝https://twitter.com/loginUser这类输入
如果你的目标平台允许其他特殊字符,只要调整正则里的字符范围就行。
方案二:创建并注册自定义验证规则(更优雅的复用方式)
如果需要在多个地方复用这个规则,或者想让代码逻辑更清晰,可以创建自定义规则:
- 生成规则文件:
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) { // 利用PHP内置函数判断是否为URL,是则返回false(不通过验证) return !filter_var($value, FILTER_VALIDATE_URL); } /** * 获取友好的错误提示 * * @return string */ public function message() { return 'The :attribute 不能是链接,请仅输入登录账号名。'; } }
- 在控制器中引入并使用规则:
use App\Rules\NotUrl; // ... $this->validate($request, [ 'google_plus' => ['required', new NotUrl], 'twitter' => ['required', new NotUrl], ]);
这个方案逻辑更严谨,错误提示也更友好,适合需要多次复用的场景。
额外小提示
如果想进一步规范登录名的长度,可以加上min和max规则,比如min:3|max:20,让验证更贴合实际需求。
内容的提问来源于stack exchange,提问作者Jadasdas
相关产品推荐
相关产品推荐

