PHP - 使用正则表达式更改电话号码格式

7
我正在尝试使用替换正则表达式将格式为+18761234567的电话号码转换为876-123-4567。

如果格式始终为xxx-xxx-xxxx,则可以使用strstr()而无需使用正则表达式来完成此操作。 - andyb
如果你对 preg_replace() 进行基准测试,并将其与三次调用 substr() 进行比较,你会发现 preg_replace() 更快。 - James C
@James C,我相信你是对的,但性能并不是一个要求,而且 OP 可能只需要做一次。如果是这样,我认为正则表达式有些过头了。虽然我不反对你的解决方案更加优雅和高效! - andyb
@andyb,"正则表达式"是必需的 ;) - James C
1
@James C 哈哈,确实是这样 - 已经注意到了!不过我始终牢记着正则表达式: 现在你有两个问题 - andyb
4个回答

20

我认为这应该可行

preg_replace('/^\+1(\d{3})(\d{3})(\d{4})$/i', '$1-$2-$3', '+18761234567');
我假设+1是常数,然后使用\d快捷方式来匹配十进制字符。在{}中的值是要匹配的字符数。

非常好的正则表达式,因为它不会破坏北美以外的数字系统。 - Terence Johnson

1

链接已更正。下次记得可以尝试找到网站并建议编辑,而不是投反对票;-)。 - jjmontes

0

我知道这不是正则表达式,但这也可以工作 :-)

$num = '+18761234567';
$formatted = substr($num, 2, 3).'-'.substr($num, 5, 3).'-'.substr($num, 8);

-2

这假设在开头有两个字符需要忽略。

preg_replace("/([0-9a-zA-Z+]{2})([0-9a-zA-Z]{3})([0-9a-zA-Z]{3})([0-9a-zA-Z]{4})/", "$2-$3-$4", '+18761234567');

在匹配电话号码时,使用a-zA-Z是不正确的。因为你在电话号码中找不到这些字符! - James C
1
实际上,如果它是一个虚荣号码,那么它就可以。例如877-Call-Today。 - Jason Small

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接