2017-06-08 56 views
-1

工作液(回答以下)正則表達式匹配號碼組/塊

$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. (614)-443 8762

實例日誌。其中每一個都作爲一條線一次處理。

  1. 細胞:9845122842辦公室:8649984345(只是數部分沒有細胞:或辦公室:需要以匹配)
  2. 7824562892; 5144459682
  3. 5144384412 ext。 282(分機或組與少於7個位數不包括連字符,空格和()可以忽略不計)
  4. 叫我上+1 8142104482下午6點以後(+1 8142104482應該匹配)

摘要所以,正則表達式應該幫助選擇數字塊(7位或更多位數),並在開頭加上可選的+,並在其間加上-,space,()

更新

這一個漂亮的取得:

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 
     ) 

) 

預期/所需

[0] => 555-1212 
[1] => 1-800-555-1212 
[2] => 1 (949) 637 2826 
[3] => +1 233 455 7878 
+0

你知道所有數字至少10長,也可以有更短的數字呢?你怎麼想4解析,與_ext._? – Halcyon

+0

也許你可以從[this](http://www.regexlib。COM/Search.aspx?K =電話)。 – ClasG

+0

@Halcyon補充一點。 – mishka

回答

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

+0

嘗試第二個,並得到這個錯誤'PHP警告:preg_match_all():未知的修飾符'?'' – mishka

+1

@mishka你使用雙引號或類似這樣的模式:'preg_match_all('/(?:[+] [ 0-9] + []?)?[(]?\ b0 * [0-9] {3} [)]?(?:[.-]?[0-9]){7} \ b /' ,$ text,$ pat_array);' – LukStorms

+0

我現在試着用雙引號'preg_match_all(「/(?:[+] [0-9] + []?)?[(]?\ b0 * [0-9] {3} [)]?(?:[.-]?[0-9]){7} \ b /「, 」致電555-1212或1-800-555-1212,1(949)637 2826 ; +1 233 455 7878「,$匹配);'它就像一個魅力。真棒。 2個負面標記已經:( – mishka