在没有正则表达式的情况下验证具有不同格式的电话号码

Posted

技术标签:

【中文标题】在没有正则表达式的情况下验证具有不同格式的电话号码【英文标题】:Validating phone number with different formats WITHOUT regex 【发布时间】:2016-12-03 17:19:36 【问题描述】:

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

    123-456-7890 1234567890 (123)4567890 (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>

【问题讨论】:

如果你不能使用正则表达式,因为它太复杂了,试试regulazy osherove.com/blog/2006/7/9/…它会为你创建正则表达式 您可能需要一个状态机逐个字符地查看它——该状态下的有效字符是什么,以及将我们移动到什么状态。请注意,您当前的代码将接受“abcdefghij”作为有效电话# 写电话号码的方法有无数种可能性 【参考方案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)

【讨论】:

这将传递“-123456789”。 确实@torazaburo 需要更多ifs【参考方案2】:

我会用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 伪类设置输入元素的样式,例如在其周围放置一个红色边框,以向用户实时反馈他们的输入无效。是的,这需要一个正则表达式——你不想再次使用正则表达式的原因是什么?

【讨论】:

【参考方案3】:

您可以手动设置:

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

【讨论】:

【参考方案4】:

Basic example提取输入数据到Array

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>

这取决于数据的结构,是否需要搜索正文等,但基本情况是......

如果是从&lt;input&gt; 中提取的简单数据,请抓取数据...

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

这将非常耗时,并且需要检查许多条件。我认为“没有 RegEx”是项目或类似的要求,如果没有,建议学习和使用 RegEx。

希望这能让你继续前进。

【讨论】:

【参考方案5】:

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

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)

【讨论】:

这将接受许多不是电话号码的字符串。 ))))01/34$89.77(99 @JohnHascall 我不同意你的推理。测试的唯一要求是数字的长度。您无法通过对电话拨号不重要的垃圾字符来确定这一点。要实际验证它,我会将其分割为区号并单独验证。

以上是关于在没有正则表达式的情况下验证具有不同格式的电话号码的主要内容,如果未能解决你的问题,请参考以下文章

常用正则表达式验证

正则表达式手机号验证问题 急~~~

电话没有使用正则表达式进行验证-Ph. Format (974) 041-0475 [重复]

求一个正则表达式,既验证固定电话也验证手机号码!

C# - 使用正则表达式验证电话号码

判断手机号正则表达式