域名是否有任何具体规则?谷歌搜索大约一个小时,但没有获得规则列表。
我已经尝试了"domain" => "required|url"
,但它已经在其中修改了协议类型,因此对我来说这不是最好的选择。
答案 0 :(得分:10)
我使用自定义规则检查有效的FQDN。
从这里获得另一个答案的正则表达式@ SO,参见:fully-qualified-domain-name-validation
其中一个答案提供了一个正则表达式,例如:
/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i
使用演示:http://regexr.com/3g5j0向您显示匹配项。
Laravel 5.5
然后我创建了一个自定义规则:
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class FQDN implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return preg_match('/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i', $value);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'Invalid FQDN.';
}
}
并像这样使用它:
// ...
use App\Rules\FQDN;
// ...
$this->validate($request, [
// other rules be here
'fqdn' => [
'required',
new FQDN(),
],
]);
编辑Laravel 5.4
在Laravel 5.4中,您没有规则合同,您可以在AppServiceProvider中扩展验证器,请参阅here(或创建单独的ExtendedValidationServiceProvider)。
您可以内联执行此操作,但我更喜欢为此设置单独的类。
在ServiceProvider引导方法中,添加:
use Illuminate\Support\Facades\Validator;
// ...
public function boot()
{
Validator::extend('fqdn', 'App\Rules\FQDN@validate');
Validator::replacer('fqdn', 'App\Rules\FQDN@replace');
}
Validator::extend()
用于验证规则
Validator::replacer()
用于显示错误消息
然后是5.4规则类:
<?php
namespace App\Rules;
class FQDN
{
public function validate($attribute, $value, $parameters, $validator)
{
return preg_match('/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i', $value);
}
public function replace($message, $attribute, $rule, $parameters)
{
return str_replace(':fqdn', implode(', ', $parameters), $message);
}
}
现在您可以使用以下验证:
$this->validate($request, [
// other rules be here
'fqdn' => [
'required',
'fqdn',
],
]);