2015-06-15 64 views
1

我試圖創建一個正則表達式,將驗證一個特定的電話號碼與868區號和特殊格式 ^ h 電話號碼,因此,我想這些正則表達式爲特定的區域代碼和格式

8680000000 

(868) 000 0000 

868-000-0000 

868 000-0000 

通過驗證,但這些

8880000000 

767-000-0000 

868-0000000 

(868)0000000 

未通過驗證。

到目前爲止我:

^((\(){0,1}(868){1}(\)){0,1})+:?((((\ |\-)(\d{3})(\ |\-)):?\d{4})+|(\d{4,7})) 

(868)0000000 

正在驗證

+0

是否有一個更廣泛的規則,你想傳遞和失敗,連接這些例子? –

回答

1

其實這是有點硬編碼的,因爲你有喜歡驗證868-000-0000但不868-0000000一些具體的要求。

正則表達式是:

(^\(868\)\ \d{3}\ \d{4})|(^868\d{7})|(^868\-\d{3}\-\d{4})|(^868\ \d{3}\-\d{4}) 

DEMO

+0

我認爲這將是答案......應該有這樣的想法......看到我需要一個特定的格式 – Kendall

2

我真的不明白爲什麼每個人都需要驗證電話號碼,以嚴格的間距,包圍,連字符,還有上帝知道的其他要求。

去掉所有不必要的字符,驗證需要驗證的內容,隨着生活繼續前進。

$phone = '(868) 555-1234'; // or 868 555.1234 or +868x55-5-123-4 etc 
$phone = preg_replace('/[^0-9]/', '', $phone); // 8685551234 
if(substring($phone, 0, 3) == '868') { 
    // great success 
} 

獎金回合。格式化數據HU-人顯示:

$phone_display = sprintf('(%s) %s-%s', 
    substring($phone,0,3), 
    substring($phone,3,3), 
    substring($phone,6,4)); 
+1

你需要否定字符類。 –

+0

雖然我同意,但聽起來OP想要某些有效的電話號碼格式失敗,所以這種解決方案不會滿足他們的需求 –

+0

這不會報告「$ 8,685,551,234'作爲有效的電話號碼嗎?編寫與你想要的文本相匹配的代碼總是微不足道的,但馬赫更難以匹配你不想要的文本。 –

0

這種正則表達式

^(\(?868\)?(\s*|-)\d{3}(\s|-)\d{4}|868\d{7})$ 

驗證這些

8680000000 
(868) 000 0000 
868-000-0000 
868 000-0000 

不驗證

8880000000 
767-000-0000 
868-0000000 
(868)0000000 

match[1]包含數

DEMO和正則表達式的解釋

+1

我知道他沒有把它當成失敗,但它匹配這些以及'868 -000 0000','868000 0000' – sln

0

你可以用一些條件語句

# ^(\()?868(?(1)\)[ ]\d{3}[ ]\d{4}|(?:(?:(-)|([ ])|)\d{3}(?(2)\2|(?(3)[ -]))\d{4}))$ 

^        # BOS 
(\()?      # (1), Form (xxx) xxx xxxx 
868       # 868 Area Code 
(?(1)       # Need Form 1 ? 
     \) 
     [ ] \d{3} [ ] \d{4} 
    |        # else 
     (?: 
      (?: 
       (-)       # (2), Form xxx-xxx-xxxx 
      | ([ ])      # (3), Form xxx xxx[ -]xxxx 
      |        # Form xxxxxxxxxx 
      ) 
      \d{3}  
      (?(2)       # Need form 2 ? 
       \2 
      |        # else 
       (?(3) [ -])     # Need form 3 ? 
      ) 
      \d{4}  
    ) 
) 
$        # EOS 

傳遞這樣做:

86.8億
(868)000 0000
868-000-0000
868 000-0000

失敗:

88.8億
767-000-0000
868-0000000
(868)0000000

0

你可以寫一個正則表達式匹配所有格式,但沒有規則說你必須這樣做。

相匹配的格式分別使你的代碼相當多的可讀性:

function matchPhoneNumber($phoneNumber) { 
    $regex = [ 
     '/^(?P<prefix>868)(?P<first>\d{3})(?P<second>\d{4})$/', 
     '/^(?P<prefix>868)-(?P<first>\d{3})-(?P<second>\d{4})$/', 
     '/^(?P<prefix>868)\s(?P<first>\d{3})-(?P<second>\d{4})$/', 
     '/^\((?P<prefix>868)\)\s(?P<first>\d{3})\s(?P<second>\d{4})$/', 
    ]; 
    foreach ($regex as $reg) { 
     if (preg_match($reg, $phoneNumber, $match) === 1) { 
      return $match; 
     } 
    } 
    return false; 
} 
0

假設PHP使用像awkgrep -E ERES做:

$ grep -E '^((868([0-9]{3}|[- ][0-9]{3}-))|(\(868\) [0-9]{3}))[0-9]{4}$' file 
8680000000 
(868) 000 0000 
868-000-0000 
868 000-0000 

,或者如果你喜歡\d而不是[0-9]

^((868(\d{3}|[- ]\d{3}-))|(\(868\) \d{3}))\d{4}$ 

任何簡短的內容都會匹配您沒有指定爲有效的其他電話號碼格式,因此我假設它們是無效的。