Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript,使用正则表达式规范化电话号码字符串_Javascript_Node.js - Fatal编程技术网

Javascript,使用正则表达式规范化电话号码字符串

Javascript,使用正则表达式规范化电话号码字符串,javascript,node.js,Javascript,Node.js,我对正则表达式真的很陌生,但下面是我要做的 我有一个电话号码输入,我需要将其转换为如下字符串: '22288333' 用户可能会像以下任何一种方式一样键入它: 222 888 3333 (222) 888 3333 12228883333 1 222 888 3333 1 (222) 888 3333 2228883333 +1 222 888 3333 我想允许用户以他们最习惯的方式键入电话号码,然后在服务器端(NodeJS)将电话号码转换为我想要的格式 下面是我在PHP中尝试的正则表达式,

我对正则表达式真的很陌生,但下面是我要做的

我有一个电话号码输入,我需要将其转换为如下字符串:

'22288333'

用户可能会像以下任何一种方式一样键入它:

222 888 3333
(222) 888 3333
12228883333
1 222 888 3333
1 (222) 888 3333
2228883333
+1 222 888 3333
我想允许用户以他们最习惯的方式键入电话号码,然后在服务器端(NodeJS)将电话号码转换为我想要的格式

下面是我在PHP中尝试的正则表达式,但我不知道如何在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)中实现这一点吗?

用两个regex替换即可轻松实现:

const unformatPhone = phone => phone.replace(/\D/g, '').replace(/^1/, '');
这可能比用一个正则表达式可以找到的任何东西都要干净得多


第一个正则表达式
/\D/g
匹配任何非数字字符。第二个,
/^1/
与前导的“1”匹配。用空字符串替换它们可以删除这两个字符。

如果您完全按照您所描述的操作,那么当有人第一次尝试输入来自美国以外的电话号码时,您的系统将失败

我建议将+1(或仅1)保留在数字中,并仅在数字中不包含其他国家/地区代码时添加它

我在这里要做的是:

  • 删除除数字和加号以外的任何内容(并可能将前导00转换为+)
  • 如果字符串以加号开头,则不要添加任何内容
  • 如果字符串以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(/^\+/, '');
    

    但我建议保留该号码,以便清楚地知道该号码包括处理该数据的任何人的国家代码,这是一个任何人都可以在世界各地直接拨打的号码。

    那么空格呢?另外,如果号码(区号)以1开头,而用户省略了国家代码,这可能会切断区号的第一位数字。没有以一开头的区号。区号只能以2-9开头,特别是为了避免这个问题。@samanime虽然这是真的,但正如OP正确指出的,至少在北美,人们肯定会输入
    1228883333
    。很少有人会提供
    +1
    ,我敢打赌零人会使用
    001
    @samanime:这当然不会尝试验证。但是这个函数有没有什么合理的格式不能正常化呢?非常好用!