我正在尝试使用正则表达式从字符串中选择电话号码,其中电话号码的格式可以是任何格式,也可以根本没有电话号码。例如:
$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);