在带有preg_replace的PHP字符串中查找电话号码的终极方法


Ultimate way to find phone numbers in PHP string with preg_replace

现在

正在处理一个项目,其中有大量的文本字符串,我们必须本地化电话号码并使其可点击用于Android手机。

电话号码可以采用不同的格式,并且在它们之前和之后具有不同的文本。有没有简单的方法来检测每种电话号码格式?一些可以使用的库?

电话号码可以显示,必须与所有这些组合一起使用。这样结果就像

<a href="tel:number">number</a>

+61 8 9000 7911

电话: +2783 207 5008

+82-2-806-0001

+56 (2) 509 69 00

+44 (0)1625 500125

+1 (305)409 0703

031-704 98 00

电话: +46 31 708 50 60

也许是这样的:

/('+'d+)?'s*('('d+'))?(['s-]?'d+)+/
  • ('+'d+)? = "+"后跟一个或多个数字(可选)
  • 's* = 任意数量的空格字符(可选)
  • ('('d+'))? = "("后跟一个或多个数字,后跟")"(可选)
  • (['s-]?'d+)+ = 一组或多组数字,可选在前面加上空格或短划线

不过,说实话,我怀疑你会找到一个单一的表达来统治所有人。 电话号码可以采用许多不同的格式,因此匹配任何可能的格式并且没有误报或误报可能是不切实际的。

不确定是否有用于此的库。 嗯。与任何国际设施一样,电话号码是标准化的,也应该有一种定义电话号码的格式。E.164 建议推荐的电话号码:http://en.wikipedia.org/wiki/E.164 。所有开源解码库都是通过读取这些标准格式构建的,所以如果你真的找不到任何现有的库,它应该会有所帮助

我想这可能适用于这些情况?

preg_replace("/('+?['d-'(')'s]{7,}?'d)/", '<a href="tel:$1">number</a>', $str);

基本上,我检查它是否可以从+开始。不必如此。然后我检查它是否有数字、-、(、) 和至少 8 个案例的空格,这样它就不会选择低的非电话号码。

尝试以下操作:

preg_match_all('/'+?[0-9]['d-'()-'s+]{5,12}[1-9]/', $text, $matches);

或:

preg_match_all('/('+?['d-'(')'s]{8,20}[0-9]?'d)/', $text, $matches);