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


Picking a Phone Number From a String (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 */
}

这可以挑选出我尝试过的所有不同的电话号码格式,但它也把价格放在一起,并假设它们也是一个电话号码。

似乎我的问题是,一个人可以很容易地区分单词之间的空格和电话号码中间的空格,但我如何让计算机做到这一点?是否有一种方法可以替换前面和后面都有数字的空格,但保留其他空格完整?有没有别的办法解决这个问题?

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

('+?[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

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

在这种情况下,您忘记给我们其他格式的例子,如"91 123 45 67",这可能会使解决方案更加复杂。

对于这些情况,我谦虚地认为这是一个最好的解决方案,使一个小函数。正则表达式太复杂,不适合作为可维护的解决方案。

看起来你想要9到12位数字的序列,除了空格,括号,句号或破折号之外没有任何东西;可能在+之前。试试这个:

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

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

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

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

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