浏览代码

Merge branch 'multiple-email-addresses' of https://github.com/kenny-evitt/bootstrapvalidator into kenny-evitt-multiple-email-addresses

Conflicts:
	dist/css/bootstrapValidator.min.css
	dist/js/bootstrapValidator.js
	dist/js/bootstrapValidator.min.js
phuoc 11 年之前
父节点
当前提交
b5e05b015b
共有 3 个文件被更改,包括 407 次插入1 次删除
  1. 56 1
      src/js/validator/emailAddress.js
  2. 176 0
      test/spec.js
  3. 175 0
      test/spec/validator/emailAddress.js

+ 56 - 1
src/js/validator/emailAddress.js

@@ -14,6 +14,8 @@
          * @param {BootstrapValidator} validator Validate plugin instance
          * @param {jQuery} $field Field element
          * @param {Object} [options]
+         * - allowMultiple: Allow multiple email addresses, separated by a comma or semicolon; default is false.
+         * - separatorRegex: Regex for character or characters expected as separator between addresses; default is comma /[,;]/, i.e. comma or semicolon.
          * @returns {Boolean}
          */
         validate: function(validator, $field, options) {
@@ -25,7 +27,60 @@
             // Email address regular expression
             // http://stackoverflow.com/questions/46155/validate-email-address-in-javascript
             var emailRegExp = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
-            return emailRegExp.test(value);
+
+            var allowMultiple = options.allowMultiple === true || options.allowMultiple === 'true';
+
+            if (allowMultiple) {
+                var separatorRegex = options.separatorRegex || /[,;]/;
+                var areValid = true;
+                var addresses = splitEmailAddresses(value, separatorRegex);
+
+                for (var i = 0; i < addresses.length; i++) {
+                    areValid = areValid && emailRegExp.test(addresses[i]);
+                }
+
+                return areValid;
+            }
+            else {
+                return emailRegExp.test(value);
+            }
         }
     };
+
+    function splitEmailAddresses(emailAddresses, separatorRegex) {
+        var quotedFragments = emailAddresses.split(/"/),
+            quotedFragmentCount = quotedFragments.length,
+            emailAddressArray = [],
+            nextEmailAddress = "";
+
+        for (var i = 0; i < quotedFragmentCount; i++) {
+            if (i % 2 === 0) {
+                var splitEmailAddressFragments = quotedFragments[i].split(separatorRegex);
+                var splitEmailAddressFragmentCount = splitEmailAddressFragments.length;
+
+                if (splitEmailAddressFragmentCount === 1){
+                    nextEmailAddress += splitEmailAddressFragments[0];
+                }
+                else {
+                    emailAddressArray.push(nextEmailAddress + splitEmailAddressFragments[0]);
+
+                    for (var j = 1; j < splitEmailAddressFragmentCount - 1; j++) {
+                        emailAddressArray.push(splitEmailAddressFragments[j]);
+                    }
+
+                    nextEmailAddress = splitEmailAddressFragments[splitEmailAddressFragmentCount - 1];
+                }
+            }
+            else {
+                nextEmailAddress += '"' + quotedFragments[i];
+
+                if (i < quotedFragmentCount - 1)
+                    nextEmailAddress += '"';
+            }
+        }
+
+        emailAddressArray.push(nextEmailAddress);
+
+        return emailAddressArray;
+    }
 }(window.jQuery));

+ 176 - 0
test/spec.js

@@ -2375,6 +2375,182 @@ describe('ean', function() {
     });
 });
 
+describe('emailAddress', function() {
+    beforeEach(function () {
+        $([
+            '<form class="form-horizontal" id="emailAddressForm">',
+                '<div id="msg"></div>',
+                '<div class="form-group">',
+                    '<input type="text" name="email-address-or-addresses" data-bv-emailaddress />',
+                '</div>',
+            '</form>'
+        ].join('\n')).appendTo('body');
+
+        $('#emailAddressForm').bootstrapValidator();
+
+        this.bv = $('#emailAddressForm').data('bootstrapValidator');
+        this.$emailAddressOrAddresses = this.bv.getFieldElements('email-address-or-addresses');
+    });
+
+    afterEach(function () {
+        $('#emailAddressForm').bootstrapValidator('destroy').remove();
+    });
+
+    var validEmailAddresses = [
+        'niceandsimple@example.com',
+        'very.common@example.com',
+        'a.little.lengthy.but.fine@dept.example.com',
+        'disposable.style.email.with+symbol@example.com',
+        'other.email-with-dash@example.com',
+        '"much.more unusual"@example.com',
+        '"very.unusual.@.unusual.com"@example.com',
+        '"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com',
+        '" "@example.org',
+        'üñîçøðé@example.com'
+    ];
+
+    var invalidEmailAddresses = [
+        'admin@mailserver1',
+        // "!#$%&'*+-/=?^_`{}|~@example.org",   // This is actually passing validation; see https://github.com/nghuuphuoc/bootstrapvalidator/issues/673
+        'üñîçøðé@üñîçøðé.com',
+        'Abc.example.com',
+        'A@b@c@example.com',
+        'a"b(c)d,e:f;gi[j\k]l@example.com',
+        'just"not"right@example.com',
+        'this is"not\allowed@example.com',
+        'this\ still\"not\\allowed@example.com'
+    ];
+
+    var validMultipleEmailAddressesForDefaultSeparators = [
+        'niceandsimple@example.com,very.common@example.com',
+        'niceandsimple@example.com;very.common@example.com',
+        'niceandsimple@example.com;very.common@example.com,a.little.lengthy.but.fine@dept.example.com'
+    ];
+
+    var invalidMultipleEmailAddressesForDefaultSeparators = [
+        'niceandsimple@example.com+very.common@example.com',
+        'niceandsimple@example.com|very.common@example.com'
+    ];
+
+    var validMultipleEmailAddressesForCommaOrDollarSignSeparators = [
+        'niceandsimple@example.com,very.common@example.com',
+        'niceandsimple@example.com$very.common@example.com',
+        'niceandsimple@example.com,very.common@example.com$a.little.lengthy.but.fine@dept.example.com'
+    ];
+
+    var invalidMultipleEmailAddressesForCommaOrDollarSignSeparators = [
+        'niceandsimple@example.com;very.common@example.com',
+        'niceandsimple@example.com;very.common@example.com,a.little.lengthy.but.fine@dept.example.com'
+    ];
+
+    it('Valid email addresses (allowMultiple=false)', function() {
+        var me = this;
+        $.each(validEmailAddresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toBeTruthy();
+        });
+    });
+
+    it('Invalid email addresses (allowMultiple=false)', function() {
+        var me = this;
+
+        var addresses = invalidEmailAddresses
+                            .concat(validMultipleEmailAddressesForDefaultSeparators)
+                            .concat(invalidMultipleEmailAddressesForDefaultSeparators)
+                            .concat(validMultipleEmailAddressesForCommaOrDollarSignSeparators)
+                            .concat(invalidMultipleEmailAddressesForCommaOrDollarSignSeparators);
+
+        $.each(addresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toEqual(false);
+        });
+    });
+
+    it('Invalid email addresses (allowMultiple=false,separatorRegex=/[,\$]/)', function() {
+        var me = this;
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'separatorRegex', /[,;]/);
+
+        var addresses = invalidEmailAddresses
+                            .concat(validMultipleEmailAddressesForDefaultSeparators)
+                            .concat(invalidMultipleEmailAddressesForDefaultSeparators)
+                            .concat(validMultipleEmailAddressesForCommaOrDollarSignSeparators)
+                            .concat(invalidMultipleEmailAddressesForCommaOrDollarSignSeparators);
+
+        $.each(addresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toEqual(false);
+        });
+    });
+
+    it('Valid email addresses (allowMultiple=true)', function() {
+        var me = this;
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'allowMultiple', true);
+
+        var addresses = validEmailAddresses
+                            .concat(validMultipleEmailAddressesForDefaultSeparators);
+
+        $.each(addresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toBeTruthy();
+        });
+    });
+
+    it('Invalid email addresses (allowMultiple=true)', function() {
+        var me = this;
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'allowMultiple', true);
+
+        var addresses = invalidEmailAddresses
+                            .concat(invalidMultipleEmailAddressesForDefaultSeparators);
+
+        $.each(addresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toEqual(false);
+        });
+    });
+
+    it('Valid email addresses (allowMultiple=true,separatorRegex=/[,\$]/)', function() {
+        var me = this;
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'allowMultiple', true);
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'separatorRegex', /[,\$]/);
+
+        var addresses = validEmailAddresses
+                            .concat(validMultipleEmailAddressesForCommaOrDollarSignSeparators);
+
+        $.each(addresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toBeTruthy();
+        });
+    });
+
+    it('Invalid email addresses (allowMultiple=true,separatorRegex=/[,\$]/)', function() {
+        var me = this;
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'allowMultiple', true);
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'separatorRegex', /[,\$]/);
+
+        var addresses = invalidEmailAddresses
+                            .concat(invalidMultipleEmailAddressesForCommaOrDollarSignSeparators);
+
+        $.each(addresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toEqual(false);
+        });
+    });
+});
+
 function greaterThanCompare() {
     var compareTo = $('#greaterThanForm').find('[name="minAge"]').val();
     $('#msg').html('greaterThanCompare() called; compare to ' + compareTo);

+ 175 - 0
test/spec/validator/emailAddress.js

@@ -0,0 +1,175 @@
+describe('emailAddress', function() {
+    beforeEach(function () {
+        $([
+            '<form class="form-horizontal" id="emailAddressForm">',
+                '<div id="msg"></div>',
+                '<div class="form-group">',
+                    '<input type="text" name="email-address-or-addresses" data-bv-emailaddress />',
+                '</div>',
+            '</form>'
+        ].join('\n')).appendTo('body');
+
+        $('#emailAddressForm').bootstrapValidator();
+
+        this.bv = $('#emailAddressForm').data('bootstrapValidator');
+        this.$emailAddressOrAddresses = this.bv.getFieldElements('email-address-or-addresses');
+    });
+
+    afterEach(function () {
+        $('#emailAddressForm').bootstrapValidator('destroy').remove();
+    });
+
+    var validEmailAddresses = [
+        'niceandsimple@example.com',
+        'very.common@example.com',
+        'a.little.lengthy.but.fine@dept.example.com',
+        'disposable.style.email.with+symbol@example.com',
+        'other.email-with-dash@example.com',
+        '"much.more unusual"@example.com',
+        '"very.unusual.@.unusual.com"@example.com',
+        '"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com',
+        '" "@example.org',
+        'üñîçøðé@example.com'
+    ];
+
+    var invalidEmailAddresses = [
+        'admin@mailserver1',
+        // "!#$%&'*+-/=?^_`{}|~@example.org",   // This is actually passing validation; see https://github.com/nghuuphuoc/bootstrapvalidator/issues/673
+        'üñîçøðé@üñîçøðé.com',
+        'Abc.example.com',
+        'A@b@c@example.com',
+        'a"b(c)d,e:f;gi[j\k]l@example.com',
+        'just"not"right@example.com',
+        'this is"not\allowed@example.com',
+        'this\ still\"not\\allowed@example.com'
+    ];
+
+    var validMultipleEmailAddressesForDefaultSeparators = [
+        'niceandsimple@example.com,very.common@example.com',
+        'niceandsimple@example.com;very.common@example.com',
+        'niceandsimple@example.com;very.common@example.com,a.little.lengthy.but.fine@dept.example.com'
+    ];
+
+    var invalidMultipleEmailAddressesForDefaultSeparators = [
+        'niceandsimple@example.com+very.common@example.com',
+        'niceandsimple@example.com|very.common@example.com'
+    ];
+
+    var validMultipleEmailAddressesForCommaOrDollarSignSeparators = [
+        'niceandsimple@example.com,very.common@example.com',
+        'niceandsimple@example.com$very.common@example.com',
+        'niceandsimple@example.com,very.common@example.com$a.little.lengthy.but.fine@dept.example.com'
+    ];
+
+    var invalidMultipleEmailAddressesForCommaOrDollarSignSeparators = [
+        'niceandsimple@example.com;very.common@example.com',
+        'niceandsimple@example.com;very.common@example.com,a.little.lengthy.but.fine@dept.example.com'
+    ];
+
+    it('Valid email addresses (allowMultiple=false)', function() {
+        var me = this;
+        $.each(validEmailAddresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toBeTruthy();
+        });
+    });
+
+    it('Invalid email addresses (allowMultiple=false)', function() {
+        var me = this;
+
+        var addresses = invalidEmailAddresses
+                            .concat(validMultipleEmailAddressesForDefaultSeparators)
+                            .concat(invalidMultipleEmailAddressesForDefaultSeparators)
+                            .concat(validMultipleEmailAddressesForCommaOrDollarSignSeparators)
+                            .concat(invalidMultipleEmailAddressesForCommaOrDollarSignSeparators);
+
+        $.each(addresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toEqual(false);
+        });
+    });
+
+    it('Invalid email addresses (allowMultiple=false,separatorRegex=/[,\$]/)', function() {
+        var me = this;
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'separatorRegex', /[,;]/);
+
+        var addresses = invalidEmailAddresses
+                            .concat(validMultipleEmailAddressesForDefaultSeparators)
+                            .concat(invalidMultipleEmailAddressesForDefaultSeparators)
+                            .concat(validMultipleEmailAddressesForCommaOrDollarSignSeparators)
+                            .concat(invalidMultipleEmailAddressesForCommaOrDollarSignSeparators);
+
+        $.each(addresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toEqual(false);
+        });
+    });
+
+    it('Valid email addresses (allowMultiple=true)', function() {
+        var me = this;
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'allowMultiple', true);
+
+        var addresses = validEmailAddresses
+                            .concat(validMultipleEmailAddressesForDefaultSeparators);
+
+        $.each(addresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toBeTruthy();
+        });
+    });
+
+    it('Invalid email addresses (allowMultiple=true)', function() {
+        var me = this;
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'allowMultiple', true);
+
+        var addresses = invalidEmailAddresses
+                            .concat(invalidMultipleEmailAddressesForDefaultSeparators);
+
+        $.each(addresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toEqual(false);
+        });
+    });
+
+    it('Valid email addresses (allowMultiple=true,separatorRegex=/[,\$]/)', function() {
+        var me = this;
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'allowMultiple', true);
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'separatorRegex', /[,\$]/);
+
+        var addresses = validEmailAddresses
+                            .concat(validMultipleEmailAddressesForCommaOrDollarSignSeparators);
+
+        $.each(addresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toBeTruthy();
+        });
+    });
+
+    it('Invalid email addresses (allowMultiple=true,separatorRegex=/[,\$]/)', function() {
+        var me = this;
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'allowMultiple', true);
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'separatorRegex', /[,\$]/);
+
+        var addresses = invalidEmailAddresses
+                            .concat(invalidMultipleEmailAddressesForCommaOrDollarSignSeparators);
+
+        $.each(addresses, function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toEqual(false);
+        });
+    });
+});