我想用html字符串替换给定的电话号码,例如
<a>click here now! (123) -456-789</a>
我认为接近它的最佳方式是找到看起来像电话号码的所有不同情况,例如:
$pattern = *any 3 numbers* *any characters up to 3 characters long*
$pattern .= *any 3 numbers* *any characters up to 3 characters long*
$pattern .= *any numbers up to 4 numbers long*
// $pattern maybe something like [0-9]{3}\.?([0-9]{3})\.?([0-9]{4})
$array = preg_match_all($pattern, $string);
foreach($array)
{
// replace the string with the the new phone number
}
基本上,正则表达式是怎样的?
答案 0 :(得分:9)
根据Local conventions for writing telephone numbers entry in Wikipedia,如果您要删除所有电话号码,则全局有多种格式。在以下示例中,占位符0
表示数字。以下是wiki条目中的示例(可能有重复项)。
0 (000) 000-0000
0000 0000
00 00 00 00
00 000 000
00000000
00 00 00 00 00
+00 0 00 00 00 00
00000 000000
+00 0000 000000
(00000) 000000
+00 0000 000000
+00 (0000) 000000
00000-000000
00000/000000
000 0000
000-000-000
0 0000 00-00-00
(0 0000) 00-00-00
0 000 000-00-00
0 (000) 000-00-00
000 000 000
000 00 00 00
000 000 000
000 000 00 00
+00 00 000 00 00
0000 000 000
(000) 0000 0000
(00000) 00000
(0000) 000 0000
0000 000 0000
0000-000 0000
0000 000 0000
00000 000000
0000 000000
0000 000 00 00
+00 000 000 00 00
(000) 0000000
+00 00 00000000
000 000 000
+00-00000-00000
(0000) 0000 0000
+00 000 0000 0000
(0000) 0000 0000
+00 (00) 000 0000
+00 (0) 000 0000
+00 (000) 000 0000
(00000) 00-0000
(000) 000-000-0000
(000) [00]0-000-0000
(00000) 0000-0000
+ 000 0000 000000
8.8.8.8
192.168.1.1
0 (000) 000-0000 ext 1
0 (000) 000-0000 x 1001
0 (000) 000-0000 extension 2
0 000 000-0000 code 3
因为虽然您可以尝试编写一些疯狂的REGEX,根据它的国家代码,拨打前缀等来符合您的目的,但这不是必需的,这将是浪费时间。从贝叶斯方法来看,较长的数字往往是18个字符(阿根廷移动电话号码),可能有前导+
个字符,后跟数字[0-9]
或\d
,括号()
,括号[]
以及可能的空格,句点
.
或连字符-
以及一个带有/
的模糊格式。
\b\+?[0-9()\[\]./ -]{7,17}\b
对于所有这些数字,我们还会附加以下扩展格式
ext 123456
x 123456
# 123456
EXT 123456
- 123456
code 2
-12
Extension 123456
\b\+?[0-9()\[\]./ -]{7,17}\s+(extension|x|#|-|code|ext)\s+[0-9]{1,6}
总的来说,你会寻找带扩展名的电话号码或电话号码:
$pattern = '!(\b\+?[0-9()\[\]./ -]{7,17}\b|\b\+?[0-9()\[\]./ -]{7,17}\s+(extension|x|#|-|code|ext)\s+[0-9]{1,6})!i';
注意: 这也会删除IP地址。如果要保留IP地址,则需要使用与我们的电话号码正则表达不匹配的内容替换IP地址中的句点,然后将其切换回来。
因此,对于您的代码,您将使用:
$string = preg_replace($pattern,'*Phone*',$string);
答案 1 :(得分:1)
我认为这将匹配两组三位数字和一组四位数字,其间有“普通”电话号码标点符号:
\d{3}[().-\s[\]]*\d{3}[().-\s[\]]*\d{4}
这允许三位数,然后是任意数量的标点字符或空格,然后是三位数,然后是更多的标点符号,然后是四位数。
然而,如果没有更好地了解输入的格式,您将永远不会确定您将获得仅电话号码而不是其他内容,或者您不会跳过任何电话号码。
如果你想用你自己的号码替换你找到的号码,我可能会尝试这样的事情:
preg_replace('/\d{3}([().-\s[\]]*)\d{3}([().-\s[\]]*)\d{4}/',
"123$1456$27890", $input);
在替换字符串中,$1
和$2
是数字之间的两个括号内的标点符号块。这样您就可以只替换找到的数字,并通过将相同的标点符号插回到结果字符串中来单独保留标点符号。
答案 2 :(得分:0)
这是我从某个地方下载的功能(不记得我从哪里得到的)。
/*
// PHP function to validate US phone number:
// (c) 2003
// No restrictions have been placed on the use of this code
//
// Updated Friday Jan 9 2004 to optionally ignore the area code:
//
// Input: a single string parameter and an optional boolean variable (default=true)
// Output: 10 digit telephone number or boolean false(0)
//
// The function will return the numerical part of the alphanumeric string
// parameter with the following sequence of characters:
// any number of spaces [optional],
// a single open parentheses [optional],
// any number of spaces [optional],
// 3 digits (area code),
// any number of spaces [optional],
// a single close parentheses [optional],
// a single dash [optional],
// any number of spaces [optional],
// 3 digits, any number of spaces [optional],
// a single dash [optional],
// any number of spaces [optional],
// 4 digits, any number of spaces [optional]:
*/
function validate_USphone($phonenumber, $useareacode=true)
{
if ( preg_match("/^[ ]*[(]{0,1}[ ]*[0-9]{3,3}[ ]*[)]{0,1}[-]{0,1}[ ]*[0-9]{3,3}[ ]*[-]{0,1}[ ]*[0-9]{4,4}[ ]*$/",$phonenumber) || (preg_match("/^[ ]*[0-9]{3,3}[ ]*[-]{0,1}[ ]*[0-9]{4,4}[ ]*$/",$phonenumber) && !$useareacode)) return preg_replace("/[^0-9]/i", "", $phonenumber);
return false;
}