【问题标题】:Laravel form text field validate for specific url?Laravel 表单文本字段验证特定网址?
【发布时间】:2015-03-15 19:46:16
【问题描述】:

我正在构建一些用户个人资料,并希望向个人资料添加社交链接,以便用户可以链接到他们的个人资料,例如 Steam、YouTube、Google+ 个人资料。

所以我找不到任何方法来验证 laravel 中的特定 url。我想要一个用户,如果他在 Steam 文本字段中设置一个链接来验证给定的 url 是否真的是 steampowered.com 的 url,或者如果不是抛出错误,则 url 无效。

我已经阅读了有关验证的文档,并且我读到有一个 URL 验证,但正如我所阅读的那样,它只是在输入格式为 url 时再次验证输入。所以基本上用户可以发布任何 url 并且它将被验证。

对于特定 URL 的 URL 验证是否存在过滤器或一些附加条件。因此,输入字段只有在用户在字段中插入:http://steamcommunity.com 时才有效。

有人如何做到这一点,或者我必须编写旧的 php 正则表达式?

【问题讨论】:

    标签: php laravel laravel-4 validation


    【解决方案1】:

    您应该明确地编写自己的自定义验证器并使用正则表达式来验证:

    \Validator::extend('checkUrl', function($attribute, $value, $parameters)
    {
        $url = $parameters[0];
        //Your pattern, not pretending to be super precise, so it's up to you
        $pattern = '/^((http|https)\:\/\/)?(www\.)?'.$url.'\..+$/'
        if(  preg_match( $pattern,$value)
        {
            return true;
        }
        return false;
    });
    

    并使用它作为规则提供给您的验证器

    $rules = [
       your_field => 'checkUrl:http://steamcommunity.com'
    ];
    

    【讨论】:

      【解决方案2】:

      没有内置这种东西。你可以写一个custom validation rule,然后按照你说的使用正则表达式。

      Validator::extend('steam_url', function($attribute, $value, $parameters)
      {
          $pattern = "#^https?://([a-z0-9-]+\.)*steamcommunity\.com(/.*)?$#";
          return !! preg_match($pattern, $value);
      });
      

      用法:'url' => 'steam_url

      或者更通用的东西:

      Validator::extend('domain', function($attribute, $value, $parameters)
      {
          $domain = $parameters[0];
          $pattern = "#^https?://([a-z0-9-]+\.)*".preg_quote($domain)."(/.*)?$#";
          return !! preg_match($pattern, $value);
      });
      

      用法:'url' => 'domain:steamcommunity.com'

      【讨论】:

        【解决方案3】:

        你的两个答案都是正确的,但是我从不喜欢使用正则表达式,我记得我去年在某个网站上做了什么来匹配网站 url,并将其匹配到用户不可能的地步输入错误的 url,这也将匹配 http 和 https。所以我的最终解决方案是使用 parse_url 方法,非常简单,并且感谢您的验证器参数示例,我还可以在多个不同的域上使用它。

        这是我的最终代码。

        Validator::extend('checkUrl', function($attribute, $value, $parameters) {
        
        $url = parse_url($value, PHP_URL_HOST);
        return $url == $parameters[0];
        

        编辑:有更简单的解决方案,而不是使用 if 方法并返回 false 或 true,您可以使用 return 方法和要验证的选项。

        return $url == $parameters[0];
        

        这将被解决为

        if($url == $parameters[0]) {
        return true
        } else {
        return false
        }
        

        【讨论】:

          猜你喜欢
          • 2019-05-09
          • 2019-12-24
          • 1970-01-01
          • 2014-04-24
          • 1970-01-01
          • 2011-03-18
          • 2016-04-02
          • 2016-09-09
          • 1970-01-01
          相关资源
          最近更新 更多