2014-01-29 31 views
1

我只是想知道如果你可愛的民間能夠給我一些指針,我可能會出錯的地方。問題與正則表達式進行驗證

我已經爲英國固定電話號碼實施了一個正則表達式檢查器,除了一組數字之外,它似乎都可以工作。這是我第一次使用正則表達式。

下面是我使用它的正則表達式:

((01([2-69][1]\s?\d{3}\s?\d{4}$|[2-9][02-9][0-9]\s?\d{3}\s?\d{3}$)))|((02((0\s?[378]\s?(\d{3}|\d{4})\s?\d{4})|([3489]{1}\d{2}\s?\d{3})\s?\d{3}))) 

那是給我找麻煩該集團是

((02(((0\s?[378]\s?(\d{3}|\d{4})\s?\d{4})$)... (in the interests of brevity, I have cut out the remaining portion of it. The parentheses are all present and correct in the full regex 

我已經檢查了它反對regexpal,它似乎正確驗證。

我使用的

02031111111 <- Valid 
    0203 111 1111 <- Valid 
    020 3111 1111 <- Valid 
    020311111111 <- Invalid (passes validation) 
    0203 11111111 <- Invalid (passes validation) 
    020 3111 11111 <- Invalid (fails validation - which is what I want) 

這是其中執行

function valid_phone(landline, country) 
      { 
       var homep = ''; 

       switch (country) 
       { 
        case 'England': 
         homep = /^((01([2-69][1]\s?\d{3}\s?\d{4}$|[2-9][02-9][0-9]\s?\d{3}\s?\d{3}$)))|((02((0\s?[378]\s?(\d{3}|\d{4})\s?\d{4})|([3489]{1}\d{2}\s?\d{3})\s?\d{3})))$/; 
         break; 
        case 'USA': 
         homep = /^((((\(\d{3}\))|(\d{3}(-|)))\d{3}(-|)\d{4})|(\+?\d{2}((-|)\d{1,8}){1,5}))$/; 
         break 
        default: 
         homep = /^((01([2-69][1]\s?\d{3}\s?\d{4}$|[2-9][02-9][0-9]\s?\d{3}\s?\d{3}$)))|((02(((0\s?[378]\s?(\d{3}|\d{4})\s?\d{4}))|([3489]{1}\d{2}\s?\d{3})\s?\d{3}$)))$/; 
       } 
       return homep.test(landline); 
      } 

正則表達式功能這是其中它被稱爲jQuery中

$('#landline').blur(function() 
      { 
       $lp = $('#landline').val(); 
       $co = $('#country').val(); 

       if (!valid_phone($lp, $co)) 
       { 
        $('#error').slideDown(); 
        $('#error').append('Wrong phone number format'); 
       } 
       else 
       { 
        $('#error').slideUp(); 
        $('#error').html(''); 
       } 
      }); 

我的代碼塊中的測試數正如我所說,任何指針將不勝感激。我相信這很簡單。我也嘗試過沒有最後的$),它仍然是一樣的。

在此先感謝。

+0

你能否提供更多的例子有效和無效的輸入?我想我已經發現了這個問題,但我不確定預期的行爲是什麼。 –

+0

那麼意外的失敗測試用例最後有五個1,但是正則表達式在末尾說'\ d {4}'(意思是「正好4位數」)。我錯過了明顯的東西嗎? – bishop

+0

@KrzysztofKosiński就像主教所說的那樣。我需要在最後有4個數字。 – Chris

回答

1

據我所知,空格只允許在數字中的某些地方,但是數字的數量是固定的。在這種情況下,問題在這裏:

(\d{3}|\d{4}) 

這匹配3或4位數字,因此它可以接受一個超長的數字。如果你想允許3個或4個數字後面輸入一個空格,你需要把它寫這樣的:

(\d{3}\s\d{4}|\d{4}\s\d{3}|\d{7}) 

完整的子正則表達式該類型的號碼:

020\s?[378]\s?(\d{3}\s\d{4}|\d{4}\s\d{3}|\d{7}) 
+0

感謝您花時間回答。當我嘗試這樣做時,有效的條目變得無效,無效的條目無法驗證,因爲我也希望它們。 我難住這個 – Chris

+0

我在我的答案中修正了一個錯字(有d \而不是\ d)。它應該現在正確工作。請注意,它會接受一些形式爲'020 3 111 1111'的數字。 –

+0

嗨Krzysztof,我確實注意到它是d \而不是\ d。感謝您更新答案:)但是,我仍然沒有進一步向前看。我不明白驗證是如何應該在正則表達式檢查器中。奇怪的是,它沒有在頁面上正確驗證。我喜歡(\ d {3} | \ d {4})\ s?\ d {4}),因爲電話號碼必須是02033333333或0203 333 3333或0203 3333333或020 33333333或020 3333 3333 - 僅用於約定英國電話號碼。感謝您查看它 – Chris