2015-10-16 197 views
-1

我正在尝试使用正则表达式从字符串中挑选电话号码,其中电话号码的格式可能只是任何内容,或者可能没有电话数字。例如:从字符串中挑选电话号码(正则表达式)

$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

“重复”问题的答案仅适用于输入中的所有数字都属于电话号码 – alexis

+0

而不是“+”的情况。使用量词应该有助于“{n,}”(n或更多次) –

回答

1

看起来像是想要9到12位数字的序列,除了空格,括号,句点或破折号之外,它们之间没有任何内容;并可能在+之前。试试这个:

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

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

或者,你可以通过删除结果中所有非数字规范收集电话号码,仅保留的数字,可能最初的“+”:

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

我想你对了。我试过你的代码,它会抛出一个错误“preg_match_all():分隔符不能是字母数字或反斜杠”。不幸的是,我不明白你的synta足够试图去调试它。 – TrapezeArtist

+0

糟糕,我忘了在正则表达式中放置斜杠!固定。 – alexis

+0

解决了它。我放入了斜线,它工作。如果数字出现在句子末尾,我已经处于完全停止问题的顶部:用rtrim将其删除并放回最后。谢谢亚历克西斯。 – TrapezeArtist

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 

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

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

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

+0

他们可以是任何国家。我只用+34作为例子。这就是为什么我试图隔离只包含数字和有时包含在电话号码中的各种字符的任何部分。然后,如果该部分字符串比价格更长,则它必须是电话号码。 – TrapezeArtist

+0

法国电话号码的格式为0X XX XX XX XX。英国的格式可以有10位,9位或7位数字。我认为一个“全球”解决方案不能轻易实现。 https://en.wikipedia.org/wiki/Telephone_numbers_in_France https://en.wikipedia.org/wiki/Telephone_numbers_in_the_United_Kingdom#Format –

+0

@RaulLuna一个微小的除了您的评论:英国的电话号码*在欧洲大陆,分为三个(5,3,3)的十*或*十*个数字,他们配对(2,2,2,2,2)。 – Martin