我有一个这样的网址: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
我错了?
答案 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 demo或this regex demo或yet 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测试器:
首先,[^]与^ []不同。 []检查除特殊术语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);
}
如果您知道更好的方法,请告诉我。