使用不同格式验证电话号码,不使用正则表达式

时间:2016-12-03 17:19:37

标签: javascript html

在JavaScript中,我需要在不使用正则表达式的情况下验证电话号码(必须使用字符串操作)。电话号码必须采用以下格式之一:

  1. 123-456-7890
  2. 1234567890
  3. (123)4567890
  4. (123)456-7890
  5. 如果电话号码不是上面列出的格式之一,我还必须提供提醒。

    我只能设法让#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>
    

5 个答案:

答案 0 :(得分:1)

由于你需要一个没有正则表达式的解决方案,我相信这应该可行。

&#13;
&#13;
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)
&#13;
&#13;
&#13;

答案 1 :(得分: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;
}

如需额外学分,请在上述课程中找到错误。

但是,你真的不需要做任何这些。您应该能够使用input元素上的pattern属性。这也将提供更好的用户体验。例如,您可以使用:invalid伪类对输入元素进行样式设置,例如在其周围放置一个红色边框,以便为用户提供其输入无效的实时反馈。是的,这需要一个正则表达式 - 你不想再次使用正则表达式的原因是什么?

答案 2 :(得分:0)

您可以手动设置:

  • 检查字符串大小是否为预期
  • 将字符串拆分为char数组,然后在try块中将它们解析为整数,如果抛出numberFormatException它应该是一个方括号()或 -

答案 3 :(得分:0)

Basic example将输入数据提取到数组

&#13;
&#13;
function test() {
  var phnTest = document.getElementById('phone').value;
  var strArray = [];
  strArray = phnTest.split('');
  document.getElementById('p').innerHTML = strArray;
}
&#13;
 <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>
&#13;
&#13;
&#13;

这取决于数据的结构,如果您需要搜索文本正文等,但基础知识将是......

如果它是<input>的简单拉动,请抓取数据......

获取输入数据,并为每个字符生成一个数组。然后你可以用strArray[3]来测试一个破折号或一个点。如果不存在,它可以继续检查连续七个数字,依此类推。

这将非常耗费并且需要检查许多条件。我假设没有RegEx&#34;&#34;是项目的要求,如果没有,建议学习和使用RegEx。

希望这能让你前进。

答案 4 :(得分:0)

这是我的尝试。关键是从字符串创建一个数组,然后过滤掉任何非数字字符。但是使用正则表达式会更容易。只是

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

&#13;
&#13;
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)
&#13;
&#13;
&#13;