如何在url中将double / multiple slash替换为single

时间:2016-11-17 07:52:22

标签: javascript regex

我有一个这样的网址:http://127.0.0.1:7000//test//test//index.html

预期输出:http://127.0.0.1:7000/test/test/index.html

我使用此正则表达式:[^http:](\/{2,})

,输出为:http://127.0.0.1:700/test/test/index.html

比赛是:'0 //''//'

这是演示:https://www.debuggex.com/r/dXZouvlec4srhg8i

我错了?

4 个答案:

答案 0 :(得分:3)

您可以使用

var res = s.replace(/(https?:\/\/)|(\/)+/g, "$1$2"); // or
var res = s.replace(/(:\/\/)|(\/)+/g, "$1$2"); //  if you do not care of the : context
var res = s.replace(/(?<!:)\/\/+/g, "/"); // Same as 2) if your environment supports ECMAScript 2018

请参阅此regex demothis regex demoyet another demo

<强>详情:

  • (https?:\/\/) - 将http://https://捕获到第1组
  • | - 或
  • (\/)+ - 匹配一个或多个斜杠,并且第2组中只保留一个/

在替换中,$1将组1内容插回到结果中(恢复协议),$2反向引用只插入一个斜杠。

var s = "http://www.gogogogo.com//something//here";
var res = s.replace(/(https?:\/\/)|(\/)+/g, "$1$2");
console.log(res);

答案 1 :(得分:1)

var = 'http://127.0.0.1:7000//test//test//index.html';
str.replace(/([^:])(\/{2,})/g,"$1/");

输出为“http://127.0.0.1:7000/test/test/index.html”。

模式'[^ http:]'表示不匹配 h t p:,所有这4个字符。

答案 2 :(得分:0)

有关正则表达式错误的解释,您可以尝试使用此在线Regexp测试器:

https://regex101.com/

首先,[^]与^ []不同。 []检查除特殊术语A-Z,a-z,0-9,A-z等之外的单个字符... [^]匹配不在其中的字符。

所以你的正则表达式基本上是这样的: 匹配一个以不是h而不是t,而不是p,而不是p开头的表达式,然后是两个或更多个/

对于完整匹配,结果是一个0 //,对于()术语,结果是在同一位置。其他// s前面有:或t,因此不匹配。

答案 3 :(得分:0)

此方法适用于PHP,但是JS的逻辑相同。不要使用regexp替换url中的斜杠。此方法不适用于许多网址,例如:

...com//test/////a///b//c//////

Regexp找到了所有匹配项,但您不能正确替换它。 使用while或do的简单方法,例如:

$req_uri = $_SERVER["REQUEST_URI"];
$s = "//";
$check = strstr($req_uri, $s);
while($check !== false){
    $req_uri = str_replace($s, "/", $req_uri);
    $check = strstr($req_uri, $s);
}

如果您知道更好的方法,请告诉我。