【问题标题】:Javascript string validation. How to write a character only once in string and only in the start?Javascript 字符串验证。如何在字符串中只写一次字符并且只在开头写一个字符?
【发布时间】:2016-03-17 10:37:13
【问题描述】:

我正在编写电话号码验证。我需要允许用户仅在输入字段的开头写入+ 字符,并防止用户稍后在字段中写入。

换句话说:

+11111111 - 对,

111111111 - 对,

+111+111+ - 假,

1111+111+ - 假

问题是我需要在输入时执行验证。结果我无法在提交后分析整个字符串,因此无法获取+ 字符的位置,因为'keyup' 总是返回0

我尝试了很多方法,这是其中之一:

  $('#signup-form').find('input[name="phone"]').on('keyup', function(e) {
        // prevent from typing letters
        $(this).val($(this).val().replace(/[^\d.+]/g, ''));

        var textVal = $(this).val();

        // check if + character occurs
        if(textVal === '+'){
          // remove + from occurring twice
          // check if + character is not the first
          if(textVal.indexOf('+') > 0){
             var newValRem = textVal.replace(/\+/, '');
             $(this).val(newValRem);
          }

        }
});

当我尝试用空字符串替换 + 字符时,它只被替换一次这是不够的,因为用户可能会错误地输入它多次。

这里是小提琴的链接:https://jsfiddle.net/johannesMt/rghLowxq/6/

请在这种情况下给我任何提示。谢谢!

【问题讨论】:

  • 试试$(this).val($(this).val().replace(/[^\d.+]|(.)\++/g, '$1'));
  • @WiktorStribiżew 你的回答是有效的,你可以把它贴在下面,我会接受它。

标签: javascript jquery regex string validation


【解决方案1】:

为了帮助您修复当前的代码(@Thomas Mauduit-Blin is right,这里还有很多事情要做,而不仅仅是在开头允许加号),您可以删除任何前面带有任何字符的加号。只需捕获该字符并使用替换模式中的反向引用进行恢复:

$(this).val($(this).val().replace(/[^\d.+]|(.)\++/g, '$1'));

请参阅 updated fiddleregex demo

模式更新为(.)\++ 替代。 (.) 将除换行符之外的任何字符捕获到组 1 中,该换行符后跟一个或多个加号,在替换过程中,组 1 的内容在 $1 反向引用的帮助下被放回。

【讨论】:

【解决方案2】:

为了更好的验证你为什么不使用Jquery maskedinput 库,它会为你做很多额外的任务,而不会为了其他目的而开销

$("#phone").mask("+999-999-9999");
$("#phone").mask("+9999-999-9999");
$("#phone").mask("+99999999999");

【讨论】:

  • 感谢您的回答,但我不想让我的项目有很多库。
【解决方案3】:

如果您想自己进行验证,则必须使用正则表达式。

但是,正如另一个相关线程here 中所述:

不要使用正则表达式来验证复杂的真实数据,例如电话号码或 URL。 Use a specialized library.

您必须让用户输入无效的电话号码,然后再进行检查,或者在表单提交和/或服务器端进行检查。在这里,您需要处理“+”字符,但还有很多其他事情要做才能获得可信赖的验证。

【讨论】:

  • 感谢您的回答,但我不想让我的项目有很多库。
  • @johannesMatevosyan 在这里,您需要处理“+”字符,但还有很多其他工作要做才能获得可信的验证。
【解决方案4】:

如果您的 textVal 有 +indexOf 将只检查第一次出现。您需要确保indexOf 不检查第一个字符。所以用substring从方程中取出第一个字符。

简单替换

if(textVal.indexOf('+') > 0){

if(textVal.substring(1).indexOf('+') > -1){

Demo

【讨论】:

  • 感谢您的回答,但它不起作用,这里是更新的小提琴:jsfiddle.net/johannesMt/rghLowxq/7
  • @johannesMatevosyan 在你的小提琴中,你没有使用 jquery
  • 但我检查了它,它显示控制台消息,它阻止在字段中输入字母,这意味着 jquery 正在工作。
  • @johannesMatevosyan 您的代码还有其他问题jsfiddle.net/gurvinder372/rghLowxq/13 试试这个代码
  • 再次感谢您的帮助,但是当字符串开头包含+(例如:+111111)时它可以正常工作,否则会出现问题(例如1111111+),它会添加数字.
猜你喜欢
  • 2017-04-06
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多