我正在尝试扩展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;
}
});
我认为返回标准化值可能会这样做,但这不起作用。验证器扩展如何修改原始输入?
答案 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');
中提取数据。