我有一个简单的URL验证器. url验证器可能是每个其他验证器.
现在,我想要的是,如果URL通过,请使用https://,http://并将其删除为var b.
所以我做了一个另外一个正则表达式,它捕获https://,http://,ftp://等等,并且说如果url通过了长测试,则获得第二个测试并用空字符串替换它.
这是我想出来的:
$("button").on('click',function () { var url = $('#in').val(); var match = /^([a-z][a-z0-9\*\-\.]*):\/\/(?:(?:(?:[\w\.\-\+!$&'\(\)*\+,;=]|%[0-9a-f]{2})+:)*(?:[\w\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})+@)?(?:(?:[a-z0-9\-\.]|%[0-9a-f]{2})+|(?:\[(?:[0-9a-f]{0,4}:)*(?:[0-9a-f]{0,4})\]))(?::[0-9]+)?(?:[\/|\?](?:[\w#!:\.\?\+=&@!$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})*)?$/; var protomatch = /^(https?|ftp):\/\/(.*)/; if (match.test(url)) { // IF VALID console.log(url + ' is valid'); // if valid replace http,https,ftp etc with empty var b = url.replace(protomatch.test(url),''); console.log(b) } else { // IF INVALID console.log('not valid') } });
为什么这不行?
解决方法
protomatch.test()返回一个布尔值,而不是字符串.
我想你只是想要:
var protomatch = /^(https?|ftp):\/\//; // NB: not '.*' ... var b = url.replace(protomatch,'');
FWIW,你的匹配正则表达式是完全不可穿透的,几乎肯定是错误的.它可能不允许国际化的领域,但很难看出我无法确定.