2016-12-03 143 views
0

在JavaScript中,我需要驗證電話號碼而不使用正則表達式(必須使用字符串操作)。的電話號碼必須在下列格式中的一個:驗證不同格式的電話號碼無正則表達式

  1. 123-456-7890
  2. (123)4567890
  3. (123)456-7890

如果電話號碼不是上面列出的格式之一,我還必須提供警報。

我只能夠設法得到#2的工作,它看起來是這樣的:

function len(gth) 
{ 
if (gth.value.length != 10) 
    { 
     alert("Telephone numbers MUST be 10 digits!"); 
    } 
} 

其倒在HTML它會調用該函數:

<p>Phone: &nbsp;&nbsp; <input id = "phone" onblur="len(this)" name = "Phone" size = "20" type = "text" maxlength = "10"> </p> 
+0

如果你不能使用正則表達式,因爲它太複雜,請嘗試regulazy http://osherove.com/blog/2006/7/9/introducing-regulazy-point-click-regular-expression.html它將創造正則表達式爲你 –

+0

你可能需要一個狀態機來查看它char-by-char - 在這個狀態下有效的字符是什麼,以及這個狀態是什麼使我們轉向。注意你當前的代碼會接受「abcdefghij」作爲有效的手機號碼# –

+1

如何寫一個電話號碼有無限的可能性 – Endless

回答

1

既然你需要在沒有正則表達式的解決方案,我認爲這應該工作。

const phones = [ 
 
    '123-456-7890', 
 
    '1234567890', 
 
    '(123)4567890', 
 
    '(123)456-7890', 
 
    '+61(123) 456-7890', 
 
    '12345', 
 
    '))))01/34$89.77(99' 
 
] 
 

 
function len(gth) { 
 
    if (gth.substring(3, 4) == '-' && gth.substring(7, 8) == '-') // 123-456-7890 
 
     gth = gth.replace('-', '').replace('-', ''); 
 
    else if (gth.substring(0, 1) == '(' && gth.substring(4, 5) == ')' && gth.substring(8, 9) == '-') // (123)456-7890 
 
     gth = gth.replace('(', '').replace(')', '').replace('-', ''); 
 
    else if (gth.substring(0, 1) == '(' && gth.substring(4, 5) == ')') // (123)4567890 
 
     gth = gth.replace('(', '').replace(')', '');   
 
    
 
    if (!isNaN(gth) && gth.length == 10) { 
 
     return true; 
 
    } 
 
    alert("Telephone numbers:" + gth + " MUST be 10 digits!"); 
 
} 
 

 
phones.forEach(len)

+0

這將通過「-123456789」。 – 2016-12-03 18:54:24

+0

這是真的@torazaburo需要更多'ifs' –

0

您可以手動設置:

  • 如果是預期的字符串大小檢查
  • 分割字符串爲char然後陣列解析它們作爲try塊內的整數若拋出NumberFormatException它應該是一個支架()或 -
0

所述輸入數據中提取到陣列的Basic example

function test() { 
 
    var phnTest = document.getElementById('phone').value; 
 
    var strArray = []; 
 
    strArray = phnTest.split(''); 
 
    document.getElementById('p').innerHTML = strArray; 
 
}
<form action="demo_form.asp"> 
 
    Phone <input id="phone" type="text" name="phone"><br> 
 
    <input type="button" value='Submit' onclick="test()"> 
 
</form> 
 
<p id='p'></p>

這取決於數據是如何構成的,如果你需要搜索文本正文等等,但基本會...

如果是從<input>簡單拉取數據...

獲取輸入數據,併爲每個字符生成一個數組。然後你可以測試一下,比如說strArray[3],用於破折號或點。如果不存在,它可以繼續檢查連續七個數字,依此類推。

這將是非常消耗,並需要檢查一些條件。我假設「沒有正則表達式」是項目或類似項目的要求,如果沒有,建議學習和使用正則表達式。

希望這會讓你走。

0

這是我的嘗試。關鍵是從字符串中創建一個數組,然後過濾掉任何非數字字符。但使用正則表達式會更容易。只是

number.replace(/(\D+)/g, '') 

const numbers = [ 
 
    '123-456-7890', 
 
    '1234567890', 
 
    '(123)4567890', 
 
    '(123)456-7890', 
 
    '+61(123) 456-7890', 
 
    '12345', 
 
    '))))01/34$89.77(99' 
 
] 
 

 
// validate a phone number 
 
function validate(number) { 
 
    const digits = clean(number) 
 
    console.log({ 
 
    number, 
 
    digits, 
 
    length: digits.length, 
 
    pass: digits.length === 10 
 
    }) 
 
} 
 

 
// remove any non digits from the number 
 
function clean(number) { 
 
    return Array.from(number).filter(char => { 
 
    return !isNaN(char) && char !== ' ' 
 
    }).join('') 
 
} 
 

 
numbers.forEach(validate)

+0

這將接受許多不是電話號碼的字符串。 ))))01/34 $ 89.77(99 –

+0

@JohnHascall我不遵循你的推理,測試的唯一要求是數字的長度,你不能確定對於電話中不重要的垃圾字符撥號,要真正驗證它,我會將它分割爲區號並單獨驗證它們 – synthet1c

+0

OP描述了唯一合法的格式 –

1

我會像x更換號碼,然後覈對預定義模式:

function check(num) { 
    let pattern = ''; 
    for (let i = 0; i < num.length; i++) { 
    pattern += num[i] >= '0' && num[i] <= '9' ? 'x' : num[i]; 
    } 

    return ['xxx-xxx-xxxx', 'xxxxxxxxxx', '(xxx)xxxxxxx', '(xxx)xxx-xxxx'] 
    .indexOf(pattern) >= 0; 
} 

對於額外的信用,發現有上述程序的bug。

然而,你並不需要做任何這些。您應該能夠使用input元素上的pattern屬性。這也將提供更好的用戶體驗。例如,您可以使用:invalid僞類對輸入元素進行樣式設置,例如通過在其周圍放置紅色邊框來向用戶提供實時反饋,表明其輸入無效。是的,這需要一個正則表達式 - 你不想再次使用正則表達式的原因是什麼?