扩展Laravel验证以修改输入

时间:2014-04-27 21:14:45

标签: php regex validation laravel laravel-4

我正在尝试扩展Laravel中的验证器以验证美国电话号码。我的正则表达式允许大多数类型(777.777.7777,(777)777-777等),但我希望验证器将它们标准化。这是我到目前为止所做的,但它没有正常化。

Validator::extend('phone', function($attribute, $value, $parameters)
{
    $value = trim($value);
    if ($value == '') { return true; }
    $match = '/^\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}$/';
    $replace = '/^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/';
    $return = '($1) $2-$3';
    if (preg_match($match, $value)) 
    {
        return preg_replace($replace, $return, $value);
    } 
    else 
    {
        return false;
    }
});

我认为返回标准化值可能会这样做,但这不起作用。验证器扩展如何修改原始输入?

1 个答案:

答案 0 :(得分:1)

我建议你不要在验证器中改变输入并让它负责验证。

但是,您可以使用Session实现所需:

Validator::extend('phone', function($attribute, $value, $parameters)
{
    $value = trim($value);
    if ($value == '') { return true; }
    $match = '/^\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}$/';
    $replace = '/^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/';
    $return = '($1) $2-$3';
    if (preg_match($match, $value)) 
    {
        Session::set('mutated', ['phone' => preg_replace($replace, $return, $value)]);
        return true;
    } 
    else 
    {
        return false;
    }
});

然后只需从Session::get('mutated');数组或点符号Session::get('mutated.phone');中提取数据。