Laravel雄辩的域名规则

Cra*_*yWu 6 php laravel eloquent

域名有什么具体规则吗?谷歌搜索大约一个小时,但没有获得规则列表.我已经尝试了,"domain" => "required|url"但它正在要求它中的协议类型,所以它不是我的最佳选择.

Rob*_*ert 11

我使用自定义规则来检查有效的FQDN.

从另一个答案@ SO获得正则表达式,请参阅:完全限定域名称验证

其中一个答案提供了一个正则表达式,例如:

/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i
Run Code Online (Sandbox Code Playgroud)

通过演示: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.';
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

// ...
use App\Rules\FQDN;

// ...
$this->validate($request, [
    // other rules be here
    'fqdn' => [
        'required',
        new FQDN(),
    ],
]);
Run Code Online (Sandbox Code Playgroud)

编辑Laravel 5.4

在Laravel 5.4中,您没有规则合同,您可以在AppServiceProvider中扩展验证器,请参阅此处(或创建单独的ExtendedValidationServiceProvider).

你可以内联这样做,但我更喜欢为此设置单独的类.

在ServiceProvider引导方法中,添加:

use Illuminate\Support\Facades\Validator;

// ...

public function boot()
{
    Validator::extend('fqdn', 'App\Rules\FQDN@validate');
    Validator::replacer('fqdn', 'App\Rules\FQDN@replace');
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以使用以下验证:

$this->validate($request, [
    // other rules be here
    'fqdn' => [
        'required',
        'fqdn',
    ],
]);
Run Code Online (Sandbox Code Playgroud)