【问题标题】:Laravel return true validation for incorrect urlsLaravel 对不正确的 url 返回 true 验证
【发布时间】:2015-12-15 19:04:12
【问题描述】:

在 laravel 中我想检查简单的 url,例如:

http://www.google.com
http://google.com
www.google.com
http://www.google.com
http://www.google

不幸的是 laravel 验证码为

['redirect_url' => 'required|url']

为这个网址返回false

www.google.com

并为http://www.google地址返回true,如何在laravel中正确检查url,这个验证不是url的最佳验证

【问题讨论】:

    标签: laravel laravel-validation


    【解决方案1】:

    您可以使用regex 验证规则进行 URL 验证

     ['redirect_url' => ['required','regex:/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i']]
    

    【讨论】:

    • 我收到此错误:preg_match(): No ending delimiter '/' found
    • @mahdipishguy 对不起.. Patter 有一个“|”符号所以,它被认为是一个新的验证规则。
    • 谢谢,这个验证返回真这个 url www.google
    【解决方案2】:

    在验证之前检查字符串是否包含 http://https:// 与此代码:

    if(!(starts_with($url, "http://") || starts_with($url, "https://")) {
            $url = "http://".$url;
    }
    

    函数 starts_with() 是 Laravel 的辅助函数。 docs

    【讨论】:

      【解决方案3】:

      Jay Dhameliya 提供的正则表达式解决方案可能是最适合您的方案的解决方案,但我只是想我会解释为什么 url 验证器无法按您的预期工作。

      如果您查看Illumination/validation/Validator validateURL function,它期望将以下内容指定为URL 的一部分。

      • 协议(http/https/etc)
      • 可选的基本身份验证
      • 域或 IP 地址
      • 可选端口
      • 尾随 / 或无或 / 后跟其他内容

      似乎没有为此验证器方法提供任何替代方案,或者说不需要协议的方式。所以再一次自定义正则表达式似乎是最好的选择。如果您计划在多个地方使用它,您可能需要考虑创建自己的自定义验证规则,请参阅docs 了解详细信息。

      【讨论】:

      • 是的,我知道,但是这个正则表达式为这个 url www.google 返回 true,这个 url 不正确但返回 true;
      • 您可以使用 validateActiveUrl 方法 github.com/illuminate/validation/blob/master/… 来验证域实际解析。有一些更精确的正则表达式可能适用于您希望看到的内容,但是 google 是一个有效的 tld 请参阅registry.google,您可以注册域名 www 所以技术上是正确的。
      猜你喜欢
      • 2020-04-02
      • 2014-02-10
      • 2023-02-14
      • 2019-12-07
      • 2016-07-03
      • 2022-01-08
      • 2018-01-03
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多