JavaScript - 替换字符串包含旧字符串,因此替换自身

时间:2013-02-05 21:40:45

标签: javascript url replace

在浏览器中使用此javascript:

var url = window.location.toString();
window.location = url.replace(/.com/, '.com.nyud.net').replace(/.net/, '.net.nyud.net');

导致以.com(以及其他TLD)结尾的网站发生这种情况:

  

website.com/123

  

website.com.nyud.net.nyud.net/123

虽然它适用于以.net结尾的网站:

  

website.net/abc

  

website.net.nyud.net/abc

如何调整它以使其正常工作?

3 个答案:

答案 0 :(得分:4)

发生这种情况是因为.net中的.com.nyud.net正在被.com.nyud.net取代。

要解决此问题,请使用一个正则表达式替换所有TLD。

window.location = url.replace(/\.(com|net|org)(?=$|\/|\?)/, '.$1.nyud.net');

我稍微修改了正则表达式,因此它使用反向引用将TLD添加到替换字符串中。它还确保.com后跟字符串的结尾或/,因此它与www.company.net之类的内容不匹配。

更新:已修复以正确替换website.com/123等网址。

答案 1 :(得分:1)

第一次用.com替换.com.nyud.net。然后第二个替换用.net替换了新的.net.nyud.net。所以你最终得到了website.com.nyud.net.nyud.net

翻转逻辑,以便在.net之前替换.com

使用 url.replace(/.net/, '.net.nyud.net').replace(/.com/, '.com.nyud.net'); 代替。

<强>更新 逃避.,因为它很特别。 url.replace(/\.net/, '.net.nyud.net').replace(/\.com/, '.com.nyud.net');

<强>更新 您可能只想在网址末尾替换: url.replace(/\.net$/, '.net.nyud.net').replace(/\.com$/, '.com.nyud.net'); 但这假定没有路径。

答案 2 :(得分:0)

您应该使用正则表达式中的$来定义您正在替换字符串的结尾而不是字符串的任何部分。

然后格式化主机而不是完整的网址,然后在/之后添加任何内容。

这样的事情:

var host = window.location.host; // website.com
var restOfUrl = window.location.pathname;

var newHost = host.replace(/\.com$/, '.com.nyud.net').replace(/\.net$/, '.net.nyud.net');
var url = newHost + restOfUrl;