1

我维护的网站正在从标准的 php url 格式转变:

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

到一个更 seo 友好的格式,像这样:

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 美元左右。

谢谢

我想我已经找到了答案这似乎现在有效:

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;
    }
}

有人能看出这有什么问题吗?

4

2 回答 2

0

你能做这样的事情吗?

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

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

于 2013-08-22T13:36:13.943 回答
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

于 2013-08-23T14:39:06.913 回答