【问题标题】:jQuery ValidationEngine and PO BoxjQuery ValidationEngine 和 PO Box
【发布时间】:2013-04-18 13:36:01
【问题描述】:

我目前正在为一个站点使用 jQuery 和 jquery ValidationEngine,它就像一个魅力。问题是我需要添加检查(和禁止)PO 的功能。邮箱地址。我环顾四周,找不到验证引擎可以正确使用的正则表达式。

我确实找到了一个适用于 Javascript 的正则表达式:

\b[p]*(ost)*\.*\s*[o|0]*(ffice)*\.*\s*b[o|0]x\b

但是当我将该正则表达式从普通的 javascript 函数移动到验证引擎语言文件时,正则表达式匹配所有内容,甚至是文本字段中的空白条目。

我添加到 jquery.validationengine-en.js 的正则表达式如下:

"notPoBox": {
    "regex": /\b[p]*(ost)*\.*\s*[o|0]*(ffice)*\.*\s*b[o|0]x\b/,
    "alertText": "* P.O. Box addresses are not allowed for shipping"
},

并且表单元素使用以下内容:

<input class="validate[custom[notPoBox]] text-input" type="text" id="ship_add1" name="ship_add2" value="" style="width:598px;" />

有什么方法可以让这个正则表达式在验证引擎框架内工作并正确匹配?我已经验证了正则表达式确实可以在页面中我自己的 javascript 上工作,因为我可以创建一个函数来匹配并在匹配时发出警报,如下所示:

function poChk() {
    $("[id*='ship_add1']").blur(function() {
        var pattern = new RegExp('\\b[p]*(ost)*\\.*\\s*[o|0]*(ffice)*\\.*\\s*b[o|0]x\\b', 'i');
        if ($("[id*='ship_add1']").val().match(pattern)) {
        alert('We are unable to ship to a Post Office Box.\nPlease provide a different shipping address.');
        return false;
    }
});

我还在http://www.regular-expressions.info/javascriptexample.html 上进行了检查,发现在各种条目(邮政信箱、邮政信箱、邮政信箱等)上都符合预期

任何帮助将不胜感激。

银虎

【问题讨论】:

  • 仅供参考,[] 与正则表达式中的() 不同。它指定一个character class[s] 仅相当于 s,我认为您的意思是 [o0] 而不是 [o|0]。我想你也是指?,而不是大多数这些地方的*
  • 不幸的是,正则表达式不是我的构建,它是我在网上找到的,并且在尝试在验证引擎上实现之前已经使用 javascript 进行了验证。

标签: jquery jquery-validation-engine


【解决方案1】:

当您定义自定义验证时,regex 将测试以验证值是否匹配表达式,如果不匹配则会生成验证错误。

按照您定义的方式,notPoBox在值 邮政信箱值时通过

您需要检查您的正则表达式匹配的反面。

您可以通过使用函数并返回正则表达式 test() 的否定值来做到这一点:

"notPoBox": {
    "func": function (field, rules, i, options) {
                var isPoBox = /\b[p]*(ost)*\.*\s*[o|0]*(ffice)*\.*\s*b[o|0]x\b/i;
                return !isPoBox.test(field.val());
     },
     "alertText": "* P.O. Box addresses are not allowed for shipping"
}, 

A working example in this JSFiddle

【讨论】:

  • 我会试试这个并告诉你。非常感谢您的反馈。
  • 我在这篇文章中给了你一个大拇指,但代码不能像我的页面那样工作,它一直说我没有定义正则表达式,它显然是必需的,所以“func :" 选项对我不起作用。但这种思路确实帮助我找到了解决方案。谢谢。
【解决方案2】:

根据 Mads Hansen 的帖子的指示,我找到了一个正则表达式函数“逆变器”,它允许我使用现有的正则表达式代码并过滤相反的代码:

/^((?!foo).)*$/i,

“invreted”邮政信箱的最终代码。对我有用的框搜索如下:

"notPoBox": {
    "regex": /^((?!\b[p]*(ost)*\.*\s*[o|0]*(ffice)*\.*\s*b[o|0]x\b).)*$/i,
    "alertText": "* P.O. Box addresses are not allowed for shipping"
},

【讨论】:

  • +1 用于回答您自己的问题。另外,负前瞻可能是更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
相关资源
最近更新 更多