2010-01-22 314 views
1

我試圖驗證一個字符串作爲電話號碼(數字和某些特殊字符)。我使用了一個現有的代碼片段:http://snippets.dzone.com/posts/show/597這似乎是正確的。但每次string.match(format)返回null,這導致顯示錯誤消息。驗證爲電話號碼

var format = /^(\+\d)*\s*(\(\d{3}\)\s*)*\d{3}(-{0,1}|\s{0,1})\d{2}(-{0,1}|\s{0,1})\d{2}$/; 
var string = jQuery(".validate_phone").val(); 
if (string.match(format) != true) { 
    // some error message 
} 

我已經檢查過,string被填滿了哪個期望值。

以下值應該匹配:
339-4248
339-42-48
(095)3394248
(095)3394248
7 (095)3394248
7(095)3394248
7(095)3394248
7(095)3394248

其他所有內容都應顯示錯誤消息。

這段代碼有什麼問題?提前致謝!

更新:下面是測試情況http://labuschin.com/material/phone

+0

什麼是「期望值」樣本? – 2010-01-22 09:15:43

+0

你可以發表一些你做或不想匹配的例子嗎?馬上我看到國際號碼沒有正確處理。 – 2010-01-22 09:16:23

+0

一些示例要匹配什麼以及哪些不會有幫助。正則表達式非常複雜。 – 2010-01-22 09:20:47

回答

3

一位朋友在Facebook的幫助我成功:

var format = /(\+\d)*\s*(\(\d{3}\)\s*)*\d{3}(-{0,1}|\s{0,1})\d{2}(-{0,1}|\s{0,1})\d{2}/; 
var nr= prompt("Phone number", "");  
if (nr.match(format) == null) { 
    alert ("incorrect"); 
} else { 
    alert ("correct"); 
} 

改變,如果從句和和移除^在開始和結束時的$。在此工作:http://labuschin.com/material/phone

0

對於一個有效的正則表達式是:(\+\d\s*)?(\(\s*\d{3}\s*\)\s*)?\d{3}([- ]?\d{2}){2}

但是,match()返回null上的非匹配項和匹配項上的捕獲值數組 - 它永遠不會返回true。如果正則表達式不匹配,您可能對search()返回匹配位置或-1。例如:

var format = /^(\+\d\s*)?(\(\s*\d{3}\s*\)\s*)?\d{3}([- ]?\d{2}){2}$/; 
var string = jQuery(".validate_phone").val(); 
if (string.search(format) == -1) { 
    // some error message 
} 
+0

對不起,在我的測試用例中不起作用。一切仍然「不正確」 – 2010-01-22 09:59:05

0

也許......你不應該使用「字符串」作爲var名稱。

var format = /^(\+\d)*\s*(\(\d{3}\)\s*)*\d{3}(-{0,1}|\s{0,1})\d{2}(-{0,1}|\s{0,1})\d{2}$/; 
var nr= prompt("Phone number", ""); 
if (!nr.match(format)) { 
alert ("incorrect"); 
} else { 
alert ("correct"); 
} 

適合我。

+0

我在這裏試過:http:// labuschin。com/material/phone 不幸的是它不能工作:( – 2010-01-22 11:06:09

+0

你的在線版本適用於我(FF,Chrome,Safari,地獄 - 即使在IE中) 測試「+7(095)3394248」和其他一些值... 但是,當我試圖複製並粘貼一個數字時,我得到了一個驗證錯誤,因爲最後有一個額外的空白。也許你應該檢查一下.. 如果你只是鍵入一些數字,讓你的字符串足夠長(7分鐘) – Orange 2010-01-22 11:18:05