使用Symfony验证电话号码

问题描述:

我想验证表单中的电话号码。我想检查这样的数字,“(”和“)”字符只是有效的。所以用户可以填写+31(0)600000000。表格中已经预设了+31。只有下面的代码可以使用这个数字,只有如何添加这两个字符?使用Symfony验证电话号码

还是有更好的方法来验证电话号码吗?

@Assert\Length(min = 8, max = 20, minMessage = "min_lenght", maxMessage = "max_lenght") 
@Assert\Regex(pattern="/^[0-9]*$/", message="number_only") 

您所需要的正则表达式是:

/^\(0\)[0-9]*$ 

或整个数

/^\+31\(0\)[0-9]*$ 

您可以测试在这里玩的您正则表达式(也包括自动生成的解释): https://www.regex101.com/r/gD0hE5/1

+0

是不是也有可能是(0 )不是必需的,但是可选的?所以(0)600000000和600000000都是有效的。 – Tom

+0

'/ ^(\(0 \))?[0-9] + $ /'将允许可选的“(0)”。你也可以通过使用'^((\ + 31)?\(0 \))'来使用'+ 31','+ 0'和' + $'。所以'+31(0)60..','(0)60..'和'60..'将会有效,而'+ 3160..'不会。 – qooplmao

+0

你也可以在'[0-9]'之后加'9'来只允许一个9个数字的字符串,比如'/ ^(\(0 \))?[0-9] {9} $ /'意思是'(0)600000000'会有效,而'(0)600000'不会。 – qooplmao

如果你需要一个好的ND数字,使用高级选项来valudate强大的验证,我会建议,使用谷歌的lib https://github.com/googlei18n/libphonenumber,有存在的Symfony2束https://github.com/misd-service-development/phone-number-bundle,你可以看到有一个断言注释:

use Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber as AssertPhoneNumber; 

/** 
* @AssertPhoneNumber 
*/ 
private $phoneNumber; 
+0

是否可以使用此捆绑来管理复合字段?即国家前缀和数字分成两个表单域? – mblaettermann

+0

不确定你想要如何“管理”,但你可以将字段合并到$ string并使用服务作为“$ phoneNumber = $ container-> get('libphonenumber.phone_number_util') - > parse($ string,PhoneNumberUtil :: UNKNOWN_REGION);” –

+0

通过管理我的意思是自动执行像Doctrine为金钱价值对象做的合并例如 – mblaettermann