【发布时间】:2013-03-26 13:21:23
【问题描述】:
我需要一个正则表达式来用一个正斜杠替换 URL 中的多个正斜杠,不包括冒号后面的那些
例如http://link.com//whatever/// 将变为 http://link.com/whatever/
【问题讨论】:
标签: javascript regex
我需要一个正则表达式来用一个正斜杠替换 URL 中的多个正斜杠,不包括冒号后面的那些
例如http://link.com//whatever/// 将变为 http://link.com/whatever/
【问题讨论】:
标签: javascript regex
我认为这应该可行:/[^:](\/+)/ 或 /[^:](\/\/+)/ 如果您只想要倍数。
它不会匹配领先的 //,但看起来你不是在寻找那个。
替换:
"http://test//a/b//d".replace(/([^:]\/)\/+/g, "$1") // --> http://test/a/b/d
【讨论】:
/([^:])\/\/+/g 就足够了
因为您已经接受了答案。为了展示更多的匹配和控制匹配,这可能会在未来帮助您:
var url = 'http://link.com//whatever///';
var set = url.match(/([^:]\/{2,3})/g); // Match (NOT ":") followed by (2 OR 3 "/")
for (var str in set) {
// Modify the data you have
var replace_with = set[str].substr(0, 1) + '/';
// Replace the match
url = url.replace(set[str], replace_with);
}
console.log(url);
将输出:
http://link.com/whatever/
在您的情况下,双打无关紧要。如果你有这个字符串:
var url = 'http://link.com//om/om/om/om/om///';
您的set 数组将包含多个m//。有点多余,因为循环会看到该变量几次。好消息是 String.replace() 如果什么也没找到,它不会替换任何内容,因此不会造成任何伤害。
您可以做的是首先从 set 中删除重复项,但这几乎需要与让 for 循环遍历它们相同数量的资源。
祝你好运!
【讨论】:
result = subject.replace(/(?<!http:)\/*\//g, "/");
或(对于 http、https、ftp 和 ftps)
result = subject.replace(/(?<!(?:ht|f)tps?:)\/*\//g, "/");
【讨论】: