Javascript 字符串验证.如何在字符串中只写一次字符,并且只在开头写一次

Javascript string validation. How to write a character only once in string and only in the start?

本文关键字:一次 字符串 开头 字符 验证 Javascript      更新时间:2023-09-26

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

换句话说:

+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/

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

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

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

请参阅更新的小提琴和正则表达式演示。

该模式使用(.)'++替代方法进行更新。 (.)捕获除组 1 中的换行符之外的任何字符,该换行符后跟一个或多个加号,并且在替换期间$1在反向引用的帮助下将组 1 的内容放回原处。

为了更好的验证 为什么不使用 Jquery maskedinput 库,它将为您完成许多额外的任务,而不会为其他目的增加开销

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

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

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

不要使用正则表达式来验证复杂的实际数据,如电话号码或 URL。使用专用库。

您必须让用户输入无效的电话号码,并在以后执行检查,或者在表单提交和/或服务器端执行检查。在这里,您需要处理"+"字符,但是要进行可靠的验证,还有很多其他事情要做。

如果你的 textVal 有 +indexOf 只会检查第一次出现。您需要确保第一个字符未被 indexOf 选中。因此,请使用substring从等式中取出第一个字符。

只需更换

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

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

演示