AngularJS accepts this for a valid URL:
var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
Django accepts this:
regex = re.compile( r'^(?:http|ftp)s?://'
The main practical difference is that AngularJS accepts http://some-host-without-tld , while Django allows http://localhost as a valid URL without TLD.
Since the problem is to rewrite the Django URL checker, I want to rewrite the AngularJS checker. I tried so that works:
app.overwriteUrlValidator = function(ngModel) { // Django RegExp, ported to JS. var URL_REGEXP = /^(?:http|ftp)s?:\/\/(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[AZ]{2,6}\.?|[A-Z0-9-]{2,}\.?)|localhost|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?::\d+)?(?:\/?|[\/?]\S+)$/gi; // Same validator as AngularJS's, only with a different RegExp. function urlValidator(value) { if (ngModel.$isEmpty(value) || URL_REGEXP.test(value)) { ngModel.$setValidity('url', true); return value; } else { ngModel.$setValidity('url', false); return undefined; } } // This is the part I'm not happy about. I need to use a timeout // because my code is executed before Angular adds its URL validator. // If I add mine before Angular does, it will not work for ??? reason. window.setTimeout(function() { ngModel.$formatters.push(urlValidator); ngModel.$parsers.push(urlValidator); }, 100); }; /** * Keep track of user interaction with input fields */ app.inputDirective = function() { function link(scope, element, attrs, ngModel) { if (ngModel && attrs.type === 'url') { app.overwriteUrlValidator(ngModel); } } return { restrict: 'A', require : '?ngModel', link : link }; }; app.directive('input', app.inputDirective); app.directive('textarea', app.inputDirective);
I would rather not switch to another validation directive because I will have to update and verify a lot of code.
Does anyone know a lasting way to do this?