JS判断字符串是否有电话号码

Mar*_*ell 2 javascript regex validation phone-number

我目前正在构建一个聊天框,并希望对用户发送的内容进行一些快速的客户端验证。我希望能够检测用户是否在消息中发送了电话号码(以尽可能多的格式,但一般美国格式就可以)并将其替换为井号(#)。我已经为电子邮件实现了这样的功能:

var message = 'Hi. This is my email: foo@bar.com. This is my number: (970)-555-7595.';
var emailExp = /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/img;

// prints: Hi. This is my email: *********. This is my number: (970)-555-7595
console.log(message.replace(emailExp, '*********'));
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样:

var message = 'Hi. This is my email: foo@bar.com. This is my number: (970)-555-7595.';
var emailExp = /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/img;
var phoneExp = SOME_CRAZY_PHONE_REGEX;

// prints: Hi. This is my email: *********. This is my number: ##########
console.log(message.replace(emailExp, '*********').replace(phoneExp, ##########));
Run Code Online (Sandbox Code Playgroud)

我有什么办法可以完成这个任务吗?我需要它来查找字符串中每个电话号码的所有实例,并将它们替换为井号。该表达式不必太疯狂,但我希望它能够匹配大多数通用的美国格式。

我确实做了一些寻找模式,但大多数都验证了完整的字符串电话号码。我正在尝试查找并替换字符串中的所有电话号码。谢谢

编辑

我不想改进我的电子邮件模式。只是在这种情况下适用的电话号码模式:)

Mar*_*ell 6

最终解决方案是:

var phoneExp = /(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?/img;
Run Code Online (Sandbox Code Playgroud)

根据 fatcat 的解决方案fatcat1111 的解决方案here。我只需要删除开头的 ^ 字符和结尾的 $ 字符。