因此,我正在设计一个供全球用户使用的网页,其中包括来自加拿大,美国,印度,英国等地的用户。我需要对此电话号码字段进行验证,但是我不确定执行此操作的最佳方法。
我能想到的一些有效格式是:
- 1800123456(印度)
- 美国电话号码中使用“-”
我对应该允许用户输入哪些特殊字符感到困惑(例如- / ()
)。过去其他人如何解决这个问题?
因此,我正在设计一个供全球用户使用的网页,其中包括来自加拿大,美国,印度,英国等地的用户。我需要对此电话号码字段进行验证,但是我不确定执行此操作的最佳方法。
我能想到的一些有效格式是:
我对应该允许用户输入哪些特殊字符感到困惑(例如- / ()
)。过去其他人如何解决这个问题?
Answers:
仅仅因为您可以约束某些东西(这是您作为程序员为编写代码所付出的报酬),但这并不意味着您实际上应该这样做。
验证数字有什么意义?为什么有用?如果用户输入“ 0800DIALTHIS”或“私は电话番号を持っていない”或“(499)123-45-67добавочный4425”,它会失败吗?它肯定会(您说“全球”。不是吗?),而用户只是想向您传达有关如何通过电话与他们联系的重要信息。
此外,它们存储数据的方式应受其使用方式的控制。您将如何使用这些数字?它们会被用来自动发送SMS垃圾邮件吗?还是由管理员手动拨打?如果是后者,则可以允许任何其他字符,因为人脑将能够以他们认为最合适的方式对其进行解析;在这种情况下,您实际上并不需要任何验证,而这只会惹恼人类用户。
由于不同的国家/地区采用不同的格式,因此很难知道数字是否有效。例如,在法国,06 12 34 56 78是有效的电话号码,而00 12 34 56 78不是有效的电话号码,因为该号码只能以01到09、06和07为手机开头。
此外,即使在同一国家/地区,电话号码也可以用多种格式书写。我见过:
最后两个是国际形式。
一般来说:
+
仅作为前导符号的符号,破折号,点,逗号和空格。不建议对每个国家/地区进行过于深入的验证。不仅存在大量规则,而且规则也会发生变化。例如,在法国,几年前没有电话号码以07或09开头。随着手机数量的增加,出现了07。而VoIP服务出现了09。
您也可以考虑特殊号码。例如,3635在法国是一个有效数字,即使它仅包含四个数字并且以非零开头。
+31 (0)30 1234567
,其中31是荷兰,030是区号,而1234567是订户。
括号,破折号和空格。
用户输入了包含这些符号的电话号码后,您可以根据国家/地区特定的规则(需要收集每个国家/地区的这些规则)对它们进行验证,然后可以在输入非数字时将其删除在您的软件内部进行处理。
这是因为IDD(国际直接拨号)使得不可能要求在拨号中实际使用任何“特殊字符”,但在打数字时会暂停。
(我一点都不了解;如果我错了,请纠正我。)
唯一需要验证的是数字位数-它与您需要呼叫的数字匹配吗?
用户可以/不应输入访问代码(例如,美国为+1)。我将告诉您原因-如果输入的是美国人,而且他们也不那么精明,他们可能会想输入001而不是1。原因是00是您从美国境内访问国际号码的方式。他们不知道那和+1之间有什么区别。如果要在区号之间(有时在同一区号中)拨打固定电话,则还要在该号码前输入1。就像日本一样。
以日本为例。访问省级固定电话,其前面带有0。但是,如果您是从日本境外拨打电话,则不需要该0。
中国的手机号码是10位数字,而香港的手机号码是8位数字。如果您的表格捕获了国家/地区,则甚至不需要在该号码的开头要求输入国家/地区代码-只需在旁边的只读文本中自动显示该国家/地区代码即可他们需要输入的号码。
清单继续。
只需验证数字位数(确保不接受任何字母),并使最终用户轻松输入正确的数字位数即可。也就是说,他们不必输入国家/地区代码,并且如果您的表格超级聪明,那么如果他们是座机号码,他们甚至不需要输入区号。或者,如果他们开始输入访问码之类的东西,例如日语数字前的0,则让他们知道他们不需要输入。
除数字外,其他所有字符都应作为讨论点-他们没有机会输入数字。
Google为此提供了lib:
Google的通用Java,C ++和JavaScript库,用于解析,格式化和验证国际电话号码。
https://github.com/googlei18n/libphonenumber
它尽了最大的努力,我确实认为某些案件没有得到处理,因为这绝非易事。让用户输入数字和字母,以后再用代码删除字母。