【问题标题】:Shorten javascript RegExp Conditional缩短 javascript RegExp 条件
【发布时间】:2016-09-25 02:38:59
【问题描述】:

我有以下在输入内的 keyup 上运行的 javascript 函数:

var passwordInput = document.getElementsByName("newPassword")[0].value;

var upperCase= new RegExp('[A-Z]');
var lowerCase= new RegExp('[a-z]');
var numbers = new RegExp('[0-9]');

if ( passwordInput.match(lowerCase) ) {
    $('.strength-check__rule[data-index="1"]').addClass('check-rule--pass');
} else {
    $('.strength-check__rule[data-index="1"]').removeClass('check-rule--pass');
}

if (passwordInput.match(upperCase)) {
    $('.strength-check__rule[data-index="2"]').addClass('check-rule--pass');
} else {
    $('.strength-check__rule[data-index="2"]').removeClass('check-rule--pass');
}

if(passwordInput.match(numbers)) {
    $('.strength-check__rule[data-index="3"]').addClass('check-rule--pass');
} else {
    $('.strength-check__rule[data-index="3"]').removeClass('check-rule--pass');
}

if(passwordInput.length >= 8) {
    $('.strength-check__rule[data-index="4"]').addClass('check-rule--pass');
} else {
    $('.strength-check__rule[data-index="4"]').removeClass('check-rule--pass');
}

每个条件中的 addClasses 只是将一个类添加到 li 以表明该条件已满足。我想知道是否有人对如何缩短或使其更简洁有任何提示,特别是前三个条件非常相似。

【问题讨论】:

  • 啊,验证世界,快乐!在你的鞋子里,我会使用第三方库,是的,它需要额外的 kb,但它会节省你的时间。在您的情况下,jqueryvalidation.org 可能是您想要查看的内容。
  • 如果它不依赖于[data-index="#"],您可以将其全部压缩到此^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.{8}),但看起来您正在跟踪个人优势。
  • @sln 是的,没错...我有一个根据每个条件更新的进度条。只是想知道是否有人对压缩此内容或使其更简洁有任何提示。
  • 你可以将代码压缩成一个for循环和一些数组,但是由于单独跟踪,上下文不能改变。
  • @sln 是的,我就是这么想的,看起来这样会更干净。只是不确定该怎么做。想提供一个漂亮的闪亮复选标记的例子:)

标签: javascript jquery regex loops if-statement


【解决方案1】:

根据您的脚本,我将其重构为不同的内容。它可以更好地考虑,但想法是您有一个评估密码强度的功能,并根据该值操纵强度计。

<input type="text" name="newPassword" onkeyup="validate();">

<ul class="strength">
    <li class="strength-1">*</li>
    <li class="strength-2">*</li>
    <li class="strength-3">*</li>
    <li class="strength-4">*</li>
</ul>

<script type="text/javascript">

    $('ul.strength').css('list-style-type', 'none').find('li').css('float', 'left').hide();

    function getPasswordStrength(password) {
        var strength = 0;
        if(password.match(/[A-Z]/)) { strength++; }
        if(password.match(/[a-z]/)) { strength++; }
        if(password.match(/[0-9]/)) { strength++; }
        if(password.length > 8) { strength++; }
        return strength;
    }

    function validate() {
        var strength = getPasswordStrength(document.getElementsByName("newPassword")[0].value);

        $('ul.strength').find('li').hide();
        for(var  i = 1; i < strength + 1; i++) {
             $('li.strength-' + i).show();
        }
    }
</script>

【讨论】:

    【解决方案2】:

    我猜你可以使用 switch .attr() 来更改类,例如:

    $("#pass").keyup(function(e) {
    var pass = $("#pass").val();
    switch (true) {
      case /((?=.*[a-z])(?=.*[A-Z])(?=.*[\d])(?=.{8,})[^ ]*)/.test(pass):
        $("#stenght").attr("class", 'green');
        break;
      case /((?=.*[a-z])(?=.*[A-Z])(?=.*[\d])[^ ]*)/.test(pass): 
        $("#stenght").attr("class",'blue');
        break;
      case /((?=.*[a-z])(?=.*[A-Z])[^ ]*)/.test(pass):
        $("#stenght").attr("class", 'orange');
        break;
      case /((?=.*[a-z])[^ ]*)/.test(pass):
        $("#stenght").attr("class",'red');
        break;
    }
      });
    .red{color:red;} .orange{color:orange;} .blue{color:blue;} .green{color:green;}
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input id="pass" type="text"><br>
    <span class="red" id="stenght">PASSWORD STENGHT<span>

    【讨论】:

      【解决方案3】:

      也许这可能有助于节省一些行和字符:

      var passwordInput = document.getElementsByName("newPassword")[0].value;
      
      var upperCase= new RegExp('[A-Z]');
      var lowerCase= new RegExp('[a-z]');
      var numbers = new RegExp('[0-9]');
      
      var x = [0,0,0,0];
      
      x[0] = passwordInput.match(lowerCase) ? 1 : 0;
      x[1] = passwordInput.match(upperCase) ? 1 : 0;
      x[2] = passwordInput.match(numbers) ? 1 : 0;
      x[3] = passwordInput.length > 7 ? 1 : 0;
      
      for (var i = 0; i < 4; i++) {
          if (x[i] == 1) {
              $('.strength-check__rule[data-index="' + (i+1) + '"]').addClass('check-rule--pass');
          } else {
              $('.strength-check__rule[data-index="' + (i+1) + '"]').removeClass('check-rule--pass');
          }
      }
      

      【讨论】:

        【解决方案4】:

        怀疑它可以比这更短:

        var passwordInput = $('[name=newPassword]').val();
        var tests = {
          1:/[a-z]/.test(passwordInput),
          2:/[A-Z]/.test(passwordInput),
          3:/[0-9]/.test(passwordInput),
          4:passwordInput.length >= 8
        };
        for(var i=1; i<=4; i++)
          $('.strength-check__rule[data-index=' +i+ ']')
          [ tests[i] ? 'addClass' : 'removeClass' ]('check-rule--pass');
        

        【讨论】:

        • 使用对象的好主意,我觉得for (var i in tests)更合适
        • 在关系方面,属性迭代似乎更合适,但这样也包括没有hasOwnProperty 的继承属性。假设它没有被扩展与首先扩展它一样糟糕,因为如果稍后包含一个脚本来扩展 Object 以完成您需要的任何功能,它可能会在以后中断。 IE has its own issues with it。如果你愿意,可以称我为“落后时代”,但在 JavaScript 工作 17 年后,我会尽可能多地支持。
        • 我明白你的意思,但是......那么使用对象而不是数组有什么好处?
        • 两个优点:一个是因为数组从索引 0 开始,我们对索引 1 到 4 感兴趣。当然,我们可以使用 i+1,但它会损害可读性。第二个优点是它使每个键与其测试的关联更加清晰。如果在某个时候需要添加另一个测试,关联不会丢失,因为通过给每个测试一个特定的键,您可以清楚地表明键很重要。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 2015-11-18
        • 2016-02-19
        • 2022-01-17
        • 2011-06-02
        • 1970-01-01
        相关资源
        最近更新 更多