去掉URL开头的字符串

199

我想从URL字符串的开头删除"www."部分。

例如,在这些测试用例中:

例如:www.test.comtest.com
例如:www.testwww.comtestwww.com
例如:testwww.comtestwww.com(如果不存在)

我需要使用正则表达式还是有智能函数可用?


这是一个非常老的问题,但值得指出的是,在2019年,您应该使用URL解析器而不是正则表达式。 - mikemaccana
9个回答

372

根据你的需求,你有几个选择,可以进行以下操作:

// this will replace the first occurrence of "www." and return "testwww.com"
"www.testwww.com".replace("www.", "");

// this will slice the first four characters and return "testwww.com"
"www.testwww.com".slice(4);

// this will replace the www. only if it is at the beginning
"www.testwww.com".replace(/^(www\.)/,"");

40
最优解很可能是最后一个。 - Christoph
25
这不是最优解。创建一个用于删除子字符串的正则表达式有些过头了! - berezovskyi
7
@berezovskiy 这取决于你正在做什么,例如,如果你正在制作一个性能至关重要的游戏,那么你是对的,在大多数情况下,我认为更好的方法是明确地表达,并且不会因为牺牲最小的性能而引入错误。尽管如此,该回答提供了三个不同的选择示例供选择。 - nicosantangelo
2
@NicoSantangelo,我必须尊重地不同意。只有最后一个答案表现符合预期。如果您不介意使用“锤子”并且可以内联正则表达式(如果需要多次运行它,则会每次编译,或者如果需要以某种方式重用前缀,则不好),那么它比我的indexOf/slice检查要优雅得多。 - berezovskyi
14
我强烈倾向于选择最后一个选项。虽然使用 slice()稍微 快一些,但在99.9% 的情况下,这是无关紧要的、过早优化。编写 replace(/^www\./,"") 的代码清晰自明。 - Tom Lord
14
第一和第二个解决方案都无法通过第三个示例测试用例。 tutut - Yarek T

63

是的,有一个正则表达式,但您不需要使用它或任何“智能”函数:

var url = "www.testwww.com";
var PREFIX = "www.";
if (url.startsWith(PREFIX)) {
  // PREFIX is exactly at the beginning
  url = url.slice(PREFIX.length);
}

4
应该使用startsWith()来替代indexOf() - Omkar76

11

如果字符串的格式始终相同,那么简单的substr()函数就足够了。

var newString = originalString.substr(4)

6
testwww.comtwww.com = 失败 - Christoph
2
@Christoph 嗯,顺便说一下,在我的回答之后,他编辑了他的问题,这就是为什么我提到“如果字符串始终具有相同的格式”。 - talnicolas
19
@ChristophпјҢж„ҸжҖқжҳҜвҖң testwww.com вҶ’ www.com = еӨұиҙҘвҖқгҖӮжҲ‘дјҡе°ҪеҠӣж¶ҰиүІе№¶дҪҝе…¶жӣҙеҠ йҖҡдҝ—жҳ“жҮӮпјҢдҪҶдёҚдҝ®ж”№еҺҹж„ҸгҖӮ - talnicolas

7

可以手动完成,例如

var str = "www.test.com",
    rmv = "www.";

str = str.slice( str.indexOf( rmv ) + rmv.length );

或者只需使用.replace()函数:
str = str.replace( rmv, '' );

2
我喜欢手动处理,因为字符串可以来自变量,而不会有弄乱正则表达式的风险。 - nha

4
您可以使用 removePrefix 函数重载 String 原型:
String.prototype.removePrefix = function (prefix) {
    const hasPrefix = this.indexOf(prefix) === 0;
    return hasPrefix ? this.substr(prefix.length) : this.toString();
};

使用方法:

const domain = "www.test.com".removePrefix("www."); // test.com

1
我认为修改String的原型是一种不好的编程实践。 - dman
1
是的,就像重载任何原型一样,风险在于与另一个方法(这里是String类上的removePrefix)发生名称冲突,相反,只需调用.removePrefix非常方便。由你决定。 - Flavien Volken

3
const removePrefix = (value, prefix) =>
   value.startsWith(prefix) ? value.slice(prefix.length) : value;

2
尝试以下内容:
var original = 'www.test.com';
var stripped = original.substring(4);

0
你可以截取URL并使用response.sendredirect(new url)方法,这将带你到具有新URL的同一页面。

-2

另一种方式:

Regex.Replace(urlString, "www.(.+)", "$1");

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