使用正则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)的数字,并添加它只有当号码不包括其他国家代码已经。

我会在这里做什么:

  1. 删除数字和一个加号(可能将前导00转换为+)
  2. 如果string以加号开始,请不要添加任何内容
  3. 如果string以1开头,则添加一个加号
  4. 如果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它们来删除它们。