使用正则expression式规范化电话号码string
我对于正则expression式真的很陌生,但是这正是我想要做的。
我有一个电话号码input,我需要它被转换成这样的string:
'2228883333'
用户可能会像以下任何一种input内容:
222 888 3333 (222) 888 3333 12228883333 1 222 888 3333 1 (222) 888 3333 2228883333 +1 222 888 3333
我想让用户input它,但是他们是最习惯的,然后将电话号码转换成我想要的格式在服务器端(NodeJS)
这里是我从PHP尝试的正则expression式,但我不知道如何在Javascript中做到这一点。
var number = req.body.phone; number = number.replace('~.*(\d{3})[^\d]{0,7}(\d{3})[^\d]{0,7}(\d{4}).*~', '$1$2$3');
任何想法如何在NodeJS(Javascript)中做到这一点?
如果您按照您所描述的内容进行操作,那么在有人尝试从美国境外input电话号码时,系统将会失败。
我build议保持+1(或只是1)的数字,并添加它只有当号码不包括其他国家代码已经。
我会在这里做什么:
- 删除数字和一个加号(可能将前导00转换为+)
- 如果string以加号开始,请不要添加任何内容
- 如果string以1开头,则添加一个加号
- 如果string以除1或1之外的其他字符开始,则添加+1
例:
var number = req.body.phone; number = number.replace(/[^\d+]+/g, ''); number = number.replace(/^00/, '+'); if (number.match(/^1/)) number = '+' + number; if (!number.match(/^\+/)) number = '+1' + number;
现在,所有的数字:
222 888 3333 (222) 888 3333 12228883333 1 222 888 3333 1 (222) 888 3333 2228883333 +1 222 888 3333
加上一些额外的:
001 222 888 3333 001 (222) 888 3333 001(222)888-3333
你应该有一个规范化的表示,但这次是:
+12228883333
支持国际号码。 如果你想要,你可以删除加号:
number = number.replace(/^\+/, '');
但是我build议保留这个数字,这个数字显然包含了处理这些数据的任何人的国家代码,这个数字是任何人都可以直接拨打世界各地的。
这很容易做两个正则expression式replace:
const unformatPhone = phone => phone.replace(/\D/g, '').replace(/^1/, '');
这可能比任何一个正则expression式都要干净得多。
第一个正则expression式, /\D/g
匹配任何非数字字符。 第二个, /^1/
匹配前导'1'。 通过用空stringreplace它们来删除它们。