如何将URL中的双斜杠/多斜杠替换为单斜杠

6
我有一个链接,形如: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个回答

11

您可以使用

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

参见此正则表达式演示此正则表达式演示,或者另一个演示

详细信息

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

在替换中,$1将第一组的内容插入结果中(还原协议),$2反向引用仅插入单个斜杠。

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


你有 JavaScript 版本吗? - Jack
1
s.replace(/(https?:\/\/)|(\/)+/g, "$1$2"); - Wiktor Stribiżew
抱歉,语言混淆了,但基本上是一样的,请参考JavaScript版本。 - Wiktor Stribiżew

3
var str = '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 : 这四个字符。

1
这个方法适用于PHP,但JS的逻辑相同。不要使用正则表达式替换URL中的斜杠。对于许多URL,此方法是不正确的,例如:
...com//test/////a///b//c//////

正则表达式找到了所有匹配项,但无法正确替换。 简单的方法是使用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);
}

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


0

如果您想了解您的正则表达式有什么问题,可以尝试使用在线正则表达式测试工具:

https://regex101.com/

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

因此,你的正则表达式基本上是这样的: 匹配以非h、非t、非p、非:开头的表达式,然后跟随两个或更多/

结果是一个完全匹配的0//和()术语处的//。其他//前面要么是:要么是t,因此不匹配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接