正则表达式匹配组/数字块

时间:2017-06-08 11:33:07

标签: php regex

工作解决方案(下面的答案)

$phones = [
    "5141234567, 5144384062",
    "608-909-5003 Home : 629-716-8085",
    "Cell: 705-111-7699 workcell: 547-924-5097",
    "729-242-1353; 718-251-0292",
    "Call 555-1212 or 1-800-555-1212, 1 (949) 637 2826; +1 233 455 7878",
    "6097999388 ext 128",
];


foreach ($phones as $phone) {
    $phone = trim($phone);
    $possibles = [];

    preg_match_all("/(?:[+][0-9]+[ ]?)?[(]?\b0*[0-9]{3}[)]?(?:[ .-]?[0-9]){7}\b/", $phone, $matches);

    echo $phone . ': ' . print_r($matches, true);
}

寻找正则表达式来获取带有空格连字符和括号的所有出现的数字。这些是用户输入的备注中的电话号码。无需寻找3位和4位数的组。

以下是一些应该匹配的示例。匹配任何匹配项,直到下一个词或;,

  1. +1 456 934 7814
  2. 09845612345
  3. (614)-443 8762
  4. 来自我们当前数据库的示例日志。这些中的每一个都作为一行一次处理。

    1. 614443 7286
    2. Cell:9845122842 Office:8649984345(只需要数字部分没有单元格:或Office:需要匹配)
    3. 7824562892; 5144459682
    4. 5144384412分机282(不包括连字符,空格和()的分机或少于7位的组可以忽略)
    5. 请在下午6点之后致电+1 8142104482(+1 8142104482应该匹配)
    6. 摘要因此,正则表达式应该帮助选择数字块(7位或更多位数),并在开头选择+ -space,{{1}介于两者之间。

      更新

      对这个很好:

      ()

      输出:

      preg_match_all("/(\d+[\-\s]\d+)+/x",
                  "Call 555-1212 or 1-800-555-1212, 1 (949) 637 2826; +1 233 455 7878", $matches);
      
      print_r($matches);
      

      预期/必需

      Array
      (
          [0] => Array
              (
                  [0] => 555-1212
                  [1] => 1-800
                  [2] => 555-1212
                  [3] => 637 2826
                  [4] => 1 233
                  [5] => 455 7878
              )
      
          [1] => Array
              (
                  [0] => 555-1212
                  [1] => 1-800
                  [2] => 555-1212
                  [3] => 637 2826
                  [4] => 1 233
                  [5] => 455 7878
              )
      
      )
      

1 个答案:

答案 0 :(得分:1)

要匹配示例中的电话号码:

[+]?0*(?<=^|[+0\s])(?:(?:[0-9]{1,2}[ ]?)?[(]?[0-9]{3}[)]?(?:[ .-]?[0-9]){7})\b

在最后7个字符之前允许空格,点或短划线 因此,它允许(123) 123-4567以及(123) 1-23 45 67

您可以对其进行测试here