从字符串中挑选电话号码(正则表达式)

时间:2015-10-16 12:36:58

标签: php regex

我正在尝试使用正则表达式从字符串中选择一个电话号码,其中电话号码的格式几乎可以是任何内容,或者可能根本没有电话号码。例如:

$string = 'My phone number is +34 961 123456.';
$string = 'My phone number is +34 (961) 123456.';
$string = 'My phone number is 961-123456.';
$string = 'My phone number is +34.961.12.34.56.';
$string = 'Product A costs €100.00 and Product B costs €134.15.';

到目前为止,我必须

$number = preg_replace("/[^0-9\/\+\.\-\s]+/", "", $string);
$number = preg_replace("/[^0-9]+/", "", $number);
if (strlen($number)>8) {
/* It's a phone number, so do something with it */
}

这适用于挑选我尝试的所有不同的电话号码格式,但它也会将价格放在一起并假设它们也是电话号码。

似乎我的问题是人类可以很容易地区分单词之间的空格和电话号码中间的空格,但我如何让计算机这样做呢?有没有办法可以替换前面和后面都有数字的空格但是保留其他空格不变?还有其他方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

看起来你想要九到十二个数字的序列,除了空格,圆括号,句号或短划线之外没有任何数字;并且可能先于+。试试这个:

preg_match_all("/\+?(?:\d[-. ()]*){9,12}/", $string, $results);

这并不完美,因为尾随标点符号(如所有示例后面的句点)将包含在匹配的字符串中。对结果列表进行后处理以修剪它:

preg_replace("/[-. ]+$/", "", $results);

或者您可以通过删除结果中的所有非数字来标准化收集的电话号码,只保留数字,可能还有一个初始的" +":

preg_replace("/[-. ()]/", "", $results);

答案 1 :(得分:1)

我怕你不喜欢它。我得到的正则表达式是:

(\+?[0-9]?[0-9]?[[:blank:],\.]?[0-9][0-9][0-9][[:blank:],\.]?[0-9][0-9][[:blank:],\.]?[0-9][0-9][[:blank:],\.]?[0-9][0-9])

说明:

( <-- is for "grouping" and get the regular expression, probably not needed here
\+? <-- optional plus sign
[0-9]?[0-9]?  <-- optional prefix code 
[[:blank:],\.]? <-- optional space (or comma or dot) between the prefix code and the rest of the number
[0-9][0-9][0-9][[:blank:],\.]? <-- optional province code 
[0-9][0-9][[:blank:],\.]?[0-9][0-9][[:blank:],\.]?[0-9][0-9] <-- number, composed by six numbers

因为这些例子是针对西班牙语的电话号码,不是吗?

在这种情况下,您忘记向我们提供其他格式的示例,例如&#34; 91 123 45 67&#34;,这可能会使解决方案更加复杂化。

对于这些情况,我谦卑地认为这是一个做一点功能的最佳解决方案。正则表达式太复杂,无法成为可维护的解决方案。