|
|
@@ -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);
|
|
|
}
|