首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PHP中的正则表达式使用一个正则表达式提取所有可能的电话/手机号码组合

PHP中的正则表达式使用一个正则表达式提取所有可能的电话/手机号码组合
EN

Stack Overflow用户
提问于 2016-10-13 17:41:44
回答 1查看 151关注 0票数 0

我正在使用php,想要从字符串中提取电话/手机号码,我有多种格式的电话号码字符串,如

$str = '(123) 456-7890 or (123)456-7890 and 1234567890 test "123.456.7890" another test "123 456 7890"';

我写了一个RE

代码语言:javascript
代码运行次数:0
运行
复制
$phoneMatches = '';
$str = '(123) 456-7890 or (123)456-7890 or 1234567890 or "123.456.7890" or "123 456 7890"';
$phonePattern = '/\b[0-9]{3}\s*[-]?\s*[0-9]{3}\s*[-]?\s*[0-9]{4}\b/';
preg_match_all($phonePattern, $str, $phoneMatches);
echo "<pre>";
print_r($phoneMatches);
exit;

但是它给了我这样的输出,

代码语言:javascript
代码运行次数:0
运行
复制
Array
(
    [0] => Array
        (
            [0] => 1234567890
            [1] => 123 456 7890
        )
)

表示只有两个,但我希望通过仅使用一个正则表达式从文本字符串中获得电话号码和手机号码的所有可能组合。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-01-27 00:25:27

我知道我来晚了,我不确定这是不是你想要的,但我想出了这个解决方案:

代码语言:javascript
代码运行次数:0
运行
复制
[+()\d].*?\d{4}(?!\d)

Demonstration: regex101.com

说明:

  • [+()\d] -我们首先匹配可能代表电话number.
  • .*?\d{4}开头的任何东西-然后匹配任何东西(使用懒惰的量词),直到我们达到四个结束数字。只需注意:我认为这是一个规则,但它可能并不总是适用的。然后,您需要修改正则表达式以包含其他cases.
  • (?!\d) -这是一个负向先行,这意味着我们不想要任何后跟数字字符的匹配。我用这个来避免一些half-matches.

另一个观察结果是,此正则表达式不验证任何电话号码。在两个匹配之间可以有任何东西,主要是因为这一部分:.*?\d{4}。这将取决于您打算在什么情况下使用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40017496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档