【问题标题】:Jquery Validation REGEX always failJquery Validation REGEX 总是失败
【发布时间】:2020-04-06 14:11:57
【问题描述】:

当正则表达式正确时,Jquery 验证总是失败,正则表达式检查框中的文本是否与以下格式匹配:YYYY-MM-DD。尝试了所有我能找到的不同方法。使用 jquery-validation gem 并正确加载 javascript 文件,因为所有其他验证都正常工作,但它总是失败。

Javascript 文件:

$(document).on('turbolinks:load',function() {
  $("#new_grand_prix").validate({
    rules: {
      "grand_prix[name]": {required: true},
      "grand_prix[laps]": {required: true, min: 0, digits: true},
      "grand_prix[country]": {required:true},
      "grand_prix[date]": {required: true, correctDateForm: true},
    }
  });
  jQuery.validator.addMethod("correctDateForm", function(value, element) {
    var r = new RegExp('^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])');
    var test = r.test($('#grand_prix_date').html());
    return test;
  }, "Date must be in the following format: YYYY-MM-DD");
});

查看:

<script src="validate_new_grand_prix_form.js"></script>
<%= form_with(model: grand_prix, local: true, id: 'new_grand_prix') do |form| %>
  <% if grand_prix.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(grand_prix.errors.count, "error") %> prohibited this grand_prix from being saved:</h2>

      <ul>
      <% grand_prix.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :name %>
    <%= form.text_area :name %>
  </div>

  <div class="field">
    <%= form.label :laps %>
    <%= form.number_field :laps %>
  </div>

  <div class="field">
    <%= form.label :country %>
    <%= form.text_area :country %>
  </div>

  <div class="field">
    <%= form.label :date %>
    <%= form.text_area :date %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

【问题讨论】:

    标签: jquery ruby-on-rails regex ruby validation


    【解决方案1】:

    看起来这段代码至少有两个问题:

    1.正则表达式

    反斜杠转义字符串中的下一个字符。例如,'\hello' 输出 'hello''\\hello' 输出 '\hello'。这在您的模式中会出现问题,因为它是作为字符串传递的。

    所以,改变

    var r = new RegExp('^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])');
    

    var r = new RegExp(/^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])/);
    

    2。如何获取输入值

    如果$('#grand_prix_date') 是输入,则使用val() 而不是html() 来获取其内容。

    所以,改变

    var test = r.test($('#grand_prix_date').html());
    

    var test = r.test($('#grand_prix_date').val());
    

    请注意,您的 RegExp 会将 0000-02-31 视为有效日期,但我认为该讨论超出了此问题的范围 :) 祝你好运!

    【讨论】:

    • 这仍然会触发验证并且不接受任何日期
    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 2013-11-02
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多