【发布时间】:2012-02-06 19:57:34
【问题描述】:
我有一个简单的 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(url) 返回 true 或 false,而不是字符串
-
您在那里使用的正则表达式远远超出了理智的范围。你必须把它拆开,否则它是一堆难以管理、难以理解、难以维护的字符,在这种状态下它对你没有任何好处。尝试分阶段的方法: 第一阶段:基本结构测试,将这些基本结构分组。第 2 阶段:对组进行更多基本测试以确定其内容: 第 3 阶段:个人有效性测试和从中提取价值。是的,它的代码多一点,但不会让你头疼,而且 bug 也会更少。
-
@tomalak 我从这里选择它:mathiasbynens.be/demo/url-regex。我正在努力创建自己的整个正则表达式,我发现这可以满足我的需求
-
@jQuerybeast 好吧,看不懂的就不要用了。坦率地说,这个不太好(我可以说我很擅长正则表达式)。
-
所以您访问了那个网站,但没有选择通过所有项测试的网站?!
标签: javascript jquery regex uri validation