我正在构建一些用户个人资料,并希望为个人资料添加社交链接,以便用户可以链接到他们,让他们说Steam,YouTube,Google+个人资料。
所以我无法找到任何方法来验证laravel中的特定网址。我想要一个用户,如果他在steam文本字段中设置一个链接来验证给定的url是否真的是steampowered.com的url,或者是否抛出url无效的错误。
我已阅读有关验证的文档,并且我读到有一个URL验证,但正如我已经阅读过的那样,只有在输入结果为url时才会再次验证输入。所以基本上用户可以发布任何网址,它将被验证。
是否有针对特定网址的网址验证的过滤器或其他条件。因此,仅当用户在字段中插入如下内容时,输入字段才有效。
有人可以如何实现,或者我必须编写旧的PHP正则表达式?
答案 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
}