Laravel表单文本字段验证特定URL?

时间:2015-01-17 06:40:44

标签: php laravel laravel-4 validation

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

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

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

是否有针对特定网址的网址验证的过滤器或其他条件。因此,仅当用户在字段中插入如下内容时,输入字段才有效。

有人可以如何实现,或者我必须编写旧的PHP正则表达式?

3 个答案:

答案 0 :(得分:1)

您绝对应该编写自己的自定义Validator并使用正则表达式来验证:

\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'
];

答案 1 :(得分:1)

这样的东西没有内置。你可以写一个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'

答案 2 :(得分:0)

你的两个答案都是正确的人,但我从来不喜欢使用正则表达式,我记得我去年在某些网站上所做的与网站网址匹配,并将其与用户无法匹配的地方相匹配输入错误的网址,这也将匹配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 $url == $parameters[0];

这将解决为

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