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

时间:2012-04-13 12:59:04

标签: php preg-replace phone-number

现在处理一个项目,我们有大量的文本字符串,我们必须本地化电话号码,并使它们可以点击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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

也许是这样的:

/(\+\d+)?\s*(\(\d+\))?([\s-]?\d+)+/
  • (\+\d+)? =“+”后跟一个或多个数字(可选)
  • \s* =任意数量的空格字符(可选)
  • (\(\d+\))? = A“(”后跟一个或多个数字后跟“)”(可选)
  • ([\s-]?\d+)+ =一组或多组数字,可选地以空格或破折号开头

说实话,不过,我怀疑你会发现一个单一的表达式来统治它们。电话号码可以采用多种不同的格式,因此匹配任何可能的格式而不是误报或否定可能是不切实际的。

答案 2 :(得分:0)

我想这可能会对这些情况有所帮助吗?

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

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

答案 3 :(得分:0)

尝试以下方法:

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);