16

我需要一个正则表达式来用一个正斜杠替换 URL 中的多个正斜杠,不包括冒号后面的斜杠

例如http://link.com//whatever///会变成http://link.com/whatever/

4

3 回答 3

33

我认为这应该可行:/[^:](\/+)/或者/[^:](\/\/+)/如果你只想要multiples

它不会匹配领先//,但看起来你不是在寻找那个。

取代:

"http://test//a/b//d".replace(/([^:]\/)\/+/g, "$1") // -->  http://test/a/b/d

工作演示

于 2013-03-26T13:23:03.713 回答
2

因为您已经接受了答案。为了显示更多的匹配和控制匹配,这可能会在将来对您有所帮助:

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 循环遍历它们相同数量的资源。

祝你好运!

于 2013-03-26T14:30:59.230 回答
0
result = subject.replace(/(?<!http:)\/*\//g, "/");

或(对于 http、https、ftp 和 ftps)

result = subject.replace(/(?<!(?:ht|f)tps?:)\/*\//g, "/");
于 2013-03-26T13:43:34.420 回答