如何在laravel 5.2中验证电话号码?

Use*_*r57 44 php laravel laravel-5.2

我想验证用户输入的电话号码,其号码应该是11,并以01开头,值字段应该只是数字.如何使用Laravel验证?

这是我的控制器:

  public function saveUser(Request $request){
        $this->validate($request,[
            'name' => 'required|max:120',
            'email' => 'required|email|unique:users',
            'phone' => 'required|min:11|numeric',
            'course_id'=>'required'
            ]);

        $user = new User();
        $user->name=  $request->Input(['name']);
        $user->email=  $request->Input(['email']);
        $user->phone=  $request->Input(['phone']);
        $user->date = date('Y-m-d');
        $user->completed_status = '0';
        $user->course_id=$request->Input(['course_id']);
        $user->save();
       return redirect('success');

    }
Run Code Online (Sandbox Code Playgroud)

Sla*_*opy 79

一种可能的解决方案是使用正则表达式.

'phone' => 'required|regex:/(01)[0-9]{9}/'
Run Code Online (Sandbox Code Playgroud)

这将检查输入从01开始,然后是9个数字.通过使用正则表达式,您不需要numericsize验证规则.

如果您想在其他地方重用此验证方法,最好创建自己的验证规则以验证电话号码.

文档:自定义验证

在你AppServiceProviderboot方法中:

Validator::extend('phone_number', function($attribute, $value, $parameters)
{
    return substr($value, 0, 2) == '01';
});
Run Code Online (Sandbox Code Playgroud)

这将允许您phone_number在应用程序的任何位置使用验证规则,因此表单验证可以是:

'phone' => 'required|numeric|phone_number|size:11'
Run Code Online (Sandbox Code Playgroud)

在验证程序扩展中,您还可以检查$value数字是否为11个字符.

  • 你的正则表达式并不完美。它从一开始就不匹配,也不检查长度,所以这也是有效的:`ht01123456789123456789`。这是正确的正则表达式(作为验证规则):`'regex:/^(\+36)[0-9]{9}$/'`。 (3认同)
  • 如果您编写电话号码验证器,它应该验证电话号码必须满足的每个要求。它还应该检查长度和数值。在您当前的解决方案中,您需要在任何使用它的地方添加其他规则。虽然它有效,但它不是一个组织良好的解决方案。验证器是不完整的,在验证通过后——不管它的名字——它不知道某个东西是否真的是一个电话号码,只是它以“01”开头。 (2认同)

小智 27

Validator::extend('phone', function($attribute, $value, $parameters, $validator) {
        return preg_match('%^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$%i', $value) && strlen($value) >= 10;
    });

Validator::replacer('phone', function($message, $attribute, $rule, $parameters) {
        return str_replace(':attribute',$attribute, ':attribute is invalid phone number');
    });
Run Code Online (Sandbox Code Playgroud)

用法

将此代码插入要使用您的应用程序启动的代码中. 此规则根据我在 长时间搜索后找到的给定模式验证电话号码,它与许多国家/地区中最常见的移动电话或电话号码相匹配. 这将允许您在应用程序的任何位置使用验证规则,因此您的表单验证可以是: app/Providers/AppServiceProvider.php



phone

 'phone' => 'required|numeric|phone' 

  • 谢谢!对于遇到此问题的人,请务必在`AppServiceProvider'的顶部添加`使用Illuminate\Support\Facades\Validator`. (5认同)
  • 这应该是更容易接受的答案,因为它比选择的更彻底。然后我再次明白,给出这个答案的时间决定了一切。 (2认同)

viv*_*ino 23

从Laravel 5.5开始,您可以使用artisan命令创建一个新规则,您可以根据您的要求进行编码,以确定它是通过还是失败.

EJ: php artisan make:rule PhoneNumber

然后app/Rules/PhoneNumber.php在方法传递上编辑

/**
 * Determine if the validation rule passes.
 *
 * @param  string  $attribute
 * @param  mixed  $value
 * @return bool
 */
public function passes($attribute, $value)
{

    return preg_match('%^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$%i', $value) && strlen($value) >= 10;
}
Run Code Online (Sandbox Code Playgroud)

然后,像通常对验证一样使用此规则:

use App\Rules\PhoneNumber;

$request->validate([
    'name' => ['required', new PhoneNumber],
]);
Run Code Online (Sandbox Code Playgroud)

文档

  • 这是最好的答案,因为 1) 使用最新的 Laravel 功能 2) 支持 i18n 数字格式 (4认同)
  • 这应该是公认的答案,因为它遵循最新的方法。 (4认同)
  • 在 laravel 的背景下,这种方式取代了这个问题中提供的所有答案,请把它推得更高 (3认同)
  • 我完全同意你们的观点! (2认同)

Ris*_*shi 12

你可以使用这个:

        'mobile_number' => ['required', 'digits:10'],
Run Code Online (Sandbox Code Playgroud)


Abh*_*hek 9

使用 required|numeric|size:11 而不是 required|min:11|numeric

  • 这也将接受DECIMAL,所以这是不正确的! (2认同)

aph*_*hoe 7

你可以尝试这个手机验证包.Laravel手机

更新

我最近发现了另一个包Lavarel Phone Validator(stuyam/laravel-phone-validator),它使用免费的Twilio电话查询服务