0

我有一个我正在尝试对其进行验证的表单。要求规定电子邮件用户名中允许使用下划线和连字符,但不允许使用特殊字符(包括连字符和下划线)作为电子邮件用户名的前导和/或尾随字符。

这会在表单验证中使用正则表达式来完成吗?还是会在单独的 jquery 函数中完成?如果将特殊字符用作电子邮件用户名的第一个或最后一个字符,我会尝试触发错误。

这是我的电子邮件字段验证码:

email: function(value, element) {
        // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
        return this.optional(element) || /^((([a-z]|\d|[\-\_]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[\-\_]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(value);
    },

这是注册表单验证的代码:

if (form == 'registration') {
    var validation_rules = {
        rules: {
            password_confirm: {
                equalTo: "#password"
            },
            email: {

            },
            email_confirm: {
                equalTo: "#email"
            },
            dd_reg_month: "required"
        },
        groups: {
            birthday: "dd_reg_month dd_reg_year"
        },
        errorPlacement: function(error, element) {
            if (element.attr("name") == "dd_reg_month" || element.attr("name") == "dd_reg_year") $("#reg_birthday").append(error);
            else error.insertAfter(element);
        },
        validClass: "success",
        success: "success",
        focusInvalid: false,
        invalidHandler: function(form, validator) {
            var errors = validator.numberOfInvalids();
            var ipAddress =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
                if (errors) {
                    var message = errors == 1 ? 'Please correct the error below' : 'Please correct the ' + errors + ' errors below.';
                    $("div.error_info").html(message);
                    $("div.error_info").show();

                } else {
                    $("div.error_info").hide();
                    $('form input.success').css('border-color', 'green');
                }
        },
        ignore: ".ignore"


    };
}

任何帮助,甚至是关于如何处理前导和尾随字符的线索,都会非常棒。

4

3 回答 3

0

感谢您的贡献!我发现了一些可以解决问题的正则表达式 - 这个网站真的很有帮助:http ://regexlib.com/DisplayPatterns.aspx

我使用的模式是这样的,由 Rob Eberhardt 发布:

^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$

想我会分享,以防有人遇到同样的问题。如果您需要通过电子邮件验证做其他事情,请查看 regex 库,它有很多很棒的模式。我是正则表达式的新手,直到今天才听说过。:-)

再次感谢!

于 2012-05-19T22:12:35.470 回答
0

我不知道 jquery,但如果正则表达式是 .NET 可能只是插入几个前瞻和后瞻断言可能会解决问题。

这是展开的。只需查看它们的添加位置并将它们插入到您的正则表达式中。
如果效果很好,如果没有,值得一试。

/
  ^
    (

(?![_-])

      (
         (
            [a-z]
          | \d
          | [\-\_]
          | [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
         )+
         (
           \.
           (
              [a-z]
            | \d
            | [\-\_]
            | [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
           )+
         )*

(?<![_-])

      )

    |

      (
        (\x22)                                           "

(?![\x01-\x20\x7f]*[_-])

        (
           (
              (
                 (\x20|\x09)*
                 (\x0d\x0a)
              )?
              (\x20|\x09)+
           )?
           (
              (
                 [\x01-\x08\x0b\x0c\x0e-\x1f\x7f]
               | \x21       
               | [\x23-\x5b]
               | [\x5d-\x7e]
               | [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
              )
            |
              (
                 \\
                 (
                    [\x01-\x09\x0b\x0c\x0d-\x7f]
                  | [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
                 )
              )
           )
        )*
        (
           (
              (\x20|\x09)*
              (\x0d\x0a)
           )?
           (\x20|\x09)+
        )?

(?<![_-][\x01-\x20\x7f]*)

        (\x22)                                           "
      )
    )

    @

    ((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i
于 2012-05-19T01:28:08.003 回答
0

如果特殊要求应该触发与常规无效电子邮件相同的错误,您可以将其放入验证功能中。

它可能包含在电子邮件验证正则表达式中,但我不打算深入研究改变它。在验证电子邮件后,我下面的代码将附加一个额外的正则表达式,以测试您的特殊情况。

email: function(value, element) {
    // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
    var valid = this.optional(element) || /^((([a-z]|\d|[\-\_]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[\-\_]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(value);
    return valid && /^[a-z].*[a-z]@.+/i.test(value);
},
于 2012-05-18T22:46:28.517 回答