2009-12-20 194 views

回答

15

這是我在網上找到的一個很酷的正則表達式。它以幾乎任何美國格式驗證一個數字並將其轉換爲(xxx)xxx-xxxx。我認爲這很好,因爲那時人們可以使用他們習慣使用的任何格式輸入任何10位數字的美國電話號碼,並從中得到格式正確的號碼。

以下是可以放入MY_form_validation類的全部函數。我希望我的表單允許空字段,所以如果你想強制一個值,你必須改變它。

function valid_phone_number_or_empty($value) 
{ 
    $value = trim($value); 
    if ($value == '') { 
     return TRUE; 
    } 
    else 
    { 
     if (preg_match('/^\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}$/', $value)) 
     { 
      return preg_replace('/^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/', '($1) $2-$3', $value); 
     } 
     else 
     { 
      return FALSE; 
     } 
    } 
} 
+0

如何將其整合到驗證線內?我是CI noob ... – 2009-12-23 03:01:17

+0

在您的庫文件夾中創建名爲MY_form_validation的文件。確保你在控制器中調用$ this-> load-> library('form_validation')。然後在處理提交的函數中,執行$ this-> form_validation-> set_rules('phone_1','Phone 1','valid_phone_number_or_empty'); phone_1是您的表單字段。 – Dana 2009-12-23 14:50:00

+0

而不是使用trim,你應該從Dan Beam獲取第一行代碼(但用$ value替換$ _POST),然後按照你想要的方式進行格式化。 – Dennis 2010-01-28 23:42:35

3

最好的辦法是根本不驗證電話號碼,除非你絕對是100%肯定你只處理美國或至少北美的電話號碼。只要你允許來自歐洲的電話號碼,我不認爲有一個涵蓋所有可能性的正則表達式。

+0

是的。這與電子郵件地址基本相同,如下所示:http://www.regular-expressions.info/email.html – 2009-12-20 23:09:23

+0

所有電話號碼的常見情況是什麼?沒錯,**號**!看到我的帖子下面 – 2009-12-20 23:18:29

+0

@丹:你的帖子高於... – MiseryIndex 2009-12-21 03:09:26

3

帶出非數字與此:

$justNumbers = preg_replace('/\D/', $_POST[ 'phone_num' ]); 

,看看是否有足夠的字符!

$numRequired = 7; // make your constraints here 
if(strlen($justNumbers) < $numRequired){ /* ... naughty naughty ... */ } 

這是鬆散的,當然,但會爲國際號碼的工作以及(所有它真的做的,如果有超過7個數字輸入是看到)。

只需根據您的規格更改所需的位數。

+0

關於這一點的事情是,有很多地方使用10位數字的電話號碼,有些地方仍然使用7號。這也不會影響使用區號或連字符/空格的括號來區分pre和修復了電話號碼。 – DrewRobertson93 2014-08-26 16:56:01

0

丹解釋的正則表達式解決方案將是實現它的方法 - 但您可能想重新考慮驗證電話號碼。如果用戶想添加他/她在紙上做的筆記,該怎麼辦? - 我看到的電話號碼字段中輸入的是這樣的東西很多值:

307-555-2323(家用)

307-555-3232下午6點後

我想今天我們可以假設用戶知道要輸入什麼。

+6

通過驗證限制數據輸入總是有很好的理由。字段不是用於筆記,它們是用於特定信息。 – 2010-06-03 21:02:41