You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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”的验证逻辑要在多个地方使用,自定义规则会更优雅,也方便维护:

  1. 首先生成自定义规则文件:
php artisan make:rule NotUrl
  1. 打开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.';
    }
}
  1. 在控制器中引入并使用这个规则:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:49:18