2013-08-22 52 views
1

网站我保持从标准的PHP URL格式移动:解析友好的URL在Javascript

http://example.com/page.php?key=value&key=value... 

一个更加搜索引擎友好的格式是这样的:

http://example.com/page/key/value/key/value... 

我使用这个功能javascript添加,更新/修改旧格式的url字符串:

function UpdateQueryString(key, value, url) { 
    if (!url) url = window.location.href; 
    var re = new RegExp("([?|&])" + key + "=.*?(&|#|$)(.*)", "gi"); 

    if (re.test(url)) { 
     if (typeof value !== 'undefined' && value !== null) 
      return url.replace(re, '$1' + key + "=" + value + '$2$3'); 
     else { 
      return url.replace(re, '$1$3').replace(/(&|\?)$/, ''); 
     } 
    } 
    else { 
     if (typeof value !== 'undefined' && value !== null) { 
      var separator = url.indexOf('?') !== -1 ? '&' : '?', 
      hash = url.split('#'); 
      url = hash[0] + separator + key + '=' + value; 
      if (hash[1]) url += '#' + hash[1]; 
      return url; 
     } 
     else 
      return url; 
    } 
} 

这工作完美。现在这个函数突出了两个不好的地方,javascript和正则表达式。我试图修改这个函数来使用斜杠,'/'而不是? & =。这是我第一次尝试它:

function myUpdateQueryString(key, value, url) 
{ 
    if (!url) url = window.location.href; 
    var re = new RegExp("([/])" + key + "(/)(.*)", "gi"); 

    if (re.test(url)) { 
     if (typeof value !== 'undefined' && value !== null) 
      return url.replace(re, '$1' + key + "/" + value + '$2$3'); 
     else { 
      return url.replace(re, '$1$3').replace(/(\/)$/, ''); 
     } 
    } 
    else { 
     if (typeof value !== 'undefined' && value !== null) { 
      var separator = '/', 
      hash = url.split('#'); 
      url = hash[0] + separator + key + '/' + value; 
      if (hash[1]) url += '#' + hash[1]; 
      return url; 
     } 
     else 
      return url; 
    }  
} 

此功能让我非常接近。它会将新的键/值添加到url字符串中,但我在更新/修改字符串中的当前值时遇到问题。 我认为它是一个简单的修复。在正则表达式和其他一些事情中,我只能在$ 2 $ 3左右包裹我的头。

感谢

我想我已经找到了答案 这似乎是工作,现在:

function UpdateQueryString(key, value, url) 
{ 
    if (!url) url = window.location.href; 
    var re = new RegExp("([/])" + key + "/.*?(/|$)", "gi"); 
    var separator = '/'; 
    if (url.match(re)) { 
     return url.replace(re, '$1' + key + "/" + value + '$2'); 
    } 
    else { 
     return url + separator + key + "/" + value; 
    } 
} 

有人能看到什么错呢?

回答

0

你可以这样做吗?

url.split('/?|&|=/').join('/'); 

这应该用斜杠替换URL中的所有问号,&符和等号。

+0

我不想替换?&和=。我正在寻找一种快速的方法来操纵JavaScript中的url字符串。每个库和功能,我看到所有处理标准page.php?键=值。我正在寻找一种方式来处理url结构时,如url /键/值的url结构。我没有发现任何东西。看来我正在使用的函数非常接近,只是正则表达式略微偏离。 – user2707535

+0

好吧,我仍然有几个问题:1)当你说改变url字符串,你的意思是一个字符串传递给函数或浏览器的url栏中的实际url?如果它是前者,那么在操作后你想用page/key/value字符串来完成什么? 2)为了澄清,你是否试图将查询字符串更改为目录结构,反之亦然? –

0
function UpdateQueryString(key, value, url) 
{ 
    if (!url) url = window.location.href; 
    var re = new RegExp("([/])" + key + "/.*?(/|$)", "gi"); 
    var separator = '/'; 
    if (url.match(re)) { 
     return url.replace(re, '$1' + key + "/" + value + '$2'); 
    } 
    else { 
     return url + separator + key + "/" + value; 
    } 
} 

这似乎工作。任何人都可以找到这个问题。我不是很擅长正则表达式或javascript