Browse Source

Merge pull request #734 from bcamarneiro/master

uri validator adds support for custom protocol
Phuoc Nguyen 11 years ago
parent
commit
f850004925
1 changed files with 50 additions and 2 deletions
  1. 50 2
      src/js/validator/uri.js

+ 50 - 2
src/js/validator/uri.js

@@ -6,7 +6,8 @@
     $.fn.bootstrapValidator.validators.uri = {
         html5Attributes: {
             message: 'message',
-            allowlocal: 'allowLocal'
+            allowlocal: 'allowLocal',
+            customprotocol: 'customProtocol'
         },
 
         enableByHtml5: function($field) {
@@ -21,6 +22,7 @@
          * @param {Object} options
          * - message: The error message
          * - allowLocal: Allow the private and local network IP. Default to false
+         * - customProtocol: User-defined protocl. Default to http/https/ftp
          * @returns {Boolean}
          */
         validate: function(validator, $field, options) {
@@ -58,8 +60,13 @@
             // - Added exclusion of private, reserved and/or local networks ranges
             //   unless `allowLocal` is true
             //
+            // - Added possibility of choosing a custom protocol
+            //
             var allowLocal = options.allowLocal === true || options.allowLocal === 'true',
-                urlExp     = new RegExp(
+                customProtocol = options.customProtocol;
+            
+            if(!customProtocol || 0 === customProtocol.length){
+            var urlExp     = new RegExp(
                     "^" +
                     // protocol identifier
                     "(?:(?:https?|ftp)://)" +
@@ -97,6 +104,47 @@
                     "(?:/[^\\s]*)?" +
                     "$", "i"
                 );
+            }
+            else{
+            var urlExp     = new RegExp(
+                    "^" +
+                    // protocol identifier
+                    "(?:(?:https?|ftp|" + customProtocol + ")://)" +
+                    // user:pass authentication
+                    "(?:\\S+(?::\\S*)?@)?" +
+                    "(?:" +
+                    // IP address exclusion
+                    // private & local networks
+                    (allowLocal
+                        ? ''
+                        : ("(?!(?:10|127)(?:\\.\\d{1,3}){3})" +
+                           "(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})" +
+                           "(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})")) +
+                    // IP address dotted notation octets
+                    // excludes loopback network 0.0.0.0
+                    // excludes reserved space >= 224.0.0.0
+                    // excludes network & broadcast addresses
+                    // (first & last IP address of each class)
+                    "(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" +
+                    "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" +
+                    "(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" +
+                    "|" +
+                    // host name
+                    "(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)" +
+                    // domain name
+                    "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*" +
+                    // TLD identifier
+                    "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))" +
+                    // Allow intranet sites (no TLD) if `allowLocal` is true
+                    (allowLocal ? '?' : '') +
+                    ")" +
+                    // port number
+                    "(?::\\d{2,5})?" +
+                    // resource path
+                    "(?:/[^\\s]*)?" +
+                    "$", "i"
+                );
+            }
 
             return urlExp.test(value);
         }