我试图把一个全面的正则表达式放在一起来验证电话号码。理想情况下,它可以处理国际格式,但它必须处理美国格式,包括以下内容:
1-234-567-8901 1-234-567-8901 x1234 1-234-567-8901 ext1234 1 (234) 567-8901 1.234.567.8901 1/234/567/8901 12345678901
我会用我目前的尝试来回答,但我希望有人有更好的和/或更优雅的东西。
我试图把一个全面的正则表达式放在一起来验证电话号码。理想情况下,它可以处理国际格式,但它必须处理美国格式,包括以下内容:
1-234-567-8901 1-234-567-8901 x1234 1-234-567-8901 ext1234 1 (234) 567-8901 1.234.567.8901 1/234/567/8901 12345678901
我会用我目前的尝试来回答,但我希望有人有更好的和/或更优雅的东西。
当前回答
更好的选择……只要去掉输入中的所有非数字字符(除了“x”和前导的“+”符号),注意,因为英国人倾向于用非标准形式的+44(0)写数字……当要求使用国际前缀时(在这种特定情况下,应该完全丢弃(0))。
然后,你会得到这样的值:
12345678901
12345678901x1234
345678901x1234
12344678901
12345678901
12345678901
12345678901
+4112345678
+441234567890
然后,当你显示,重新格式化为您的心脏内容。如。
1 (234) 567-8901
1 (234) 567-8901 x1234
其他回答
我也在为同样的问题而挣扎,试图让我的应用程序经得起未来的考验,但这些人让我走上了正确的方向。我实际上并不是在检查数字本身,看它是否有效,我只是试图确保输入的一系列数字可能有或没有扩展名。
最坏的情况是,如果用户必须从XML文件中提取一个未格式化的数字,他们仍然只是将数字输入到手机的数字pad 012345678x5中,没有真正的理由保持它的美观。这种RegEx对我来说是这样的:
\d+ ?\w{0,9} ?\d+
01234467分机号123456 01234567 x123456 01234567890
你会很难用一个简单的正则表达式处理国际号码,看看这篇关于国际(甚至北美)电话号码的困难的文章。
您需要解析前几位数字以确定国家代码,然后根据国家采取不同的操作。
除此之外——你给出的列表不包括另一种常见的美国格式——省略了首字母1。在美国,大多数手机都不需要这种功能,这将开始困扰年轻一代,除非他们拨打国际长途电话。
你已经正确地认识到这是一个棘手的问题。
亚当
土耳其的工作例子,只要改变
d{9}
根据你的需要,开始使用吧。
function validateMobile($phone)
{
$pattern = "/^(05)\d{9}$/";
if (!preg_match($pattern, $phone))
{
return false;
}
return true;
}
$phone = "0532486061";
if(!validateMobile($phone))
{
echo 'Incorrect Mobile Number!';
}
$phone = "05324860614";
if(validateMobile($phone))
{
echo 'Correct Mobile Number!';
}
你可能会更好地使用掩码输入。这样用户只能输入数字,你可以设置你认为合适的格式。我不确定这是否是一个web应用程序,但如果是有一个非常点击jQuery插件,提供了一些选项来做这件事。
http://digitalbush.com/projects/masked-input-plugin/
他们甚至在教程中讨论了如何屏蔽电话号码输入。
我倾向于同意去掉非数字,只接受最好的。也许是为了确保至少有几个数字,尽管这确实禁止像字母电话号码“ASK-JAKE”这样的东西。
一些简单的perl表达式可能是:
@f = /(\d+)/g;
tr/0-9//dc;
使用第一个来保持数字组在一起,这可能会提供格式化线索。使用第二个来简单地丢弃所有非数字。
您是否担心可能需要暂停,然后输入更多的键?或者是555-1212(等哔声)123?