web-dev-qa-db-fra.com

Rechercher et remplacer une valeur de paramètre de chaîne de requête spécifique en javascript

J'ai une chaîne qui ressemble à ceci:

a_href= "www.google.com/test_ref=abc";

J'ai besoin de rechercher test_ref = abc dans cette séquence ci-dessus et de le remplacer par une nouvelle valeur

var updated_test_ref = "xyz";

a_href ="www.google.com/test_ref=updated_test_ref" 

c'est à dire

www.google.com/test_ref=xyz.

Comment peut-on le faire ?

ÉDITER:

la valeur test_ref peut être un lien URL en soi quelque chose comme http://google.com?param1=test1param2=test2 . Je dois capturer la valeur complète pas avant la première.

35
TopCoder
a_href = a_href.replace(/(test_ref=)[^\&]+/, '$1' + updated_test_ref);
56
Mark Kahn

Sur la base de cette discussion, j'ai corrigé la fonction Chris (problème avec la chaîne d'expression régulière!)

function updateUrlParameter(url, param, value){
    var regex = new RegExp('('+param+'=)[^\&]+');
    return url.replace( regex , '$1' + value);
}
3
Nejc Lepen

Sur la base de cette discussion, j'ai créé une fonction de références. prendre plaisir

updateUrlParameter(url, param, value){
    var regex = new RegExp("/([?|&]" + param + "=)[^\&]+/");
    return url.replace(regex, '$1' + value);
}
2
Chris

Je cherchais cette solution depuis quelques heures et suis finalement tombé sur cette question. J'ai essayé toutes les solutions ici. Mais il y a toujours un problème lors du remplacement d'une valeur de paramètre spécifique dans l'URL. Prenons un exemple d'URL comme

http://google.com?param1=test1&param2=test2&anotherparam1=test3

et l'URL mise à jour devrait être comme

http://google.com?param1=newtest&param2=test2&anotherparam1=test3, où la valeur de param1 est changé.

Dans ce cas, comme l'a souligné @ Panthro , en ajoutant [?|&] avant la chaîne de requête garantit que anotherparam1 n'est pas remplacé. Mais cette solution ajoute également le "?" ou le caractère '&' à la chaîne correspondante. Ainsi, tout en remplaçant les caractères correspondants, le "?" ou '&' sera également remplacé. Vous ne saurez pas exactement quel caractère est remplacé, vous ne pouvez donc pas ajouter ce caractère également.

La solution est de faire correspondre '?' ou '&' comme caractères précédents uniquement.

J'ai réécrit la fonction de @ Chris , corrigeant le problème avec une chaîne et j'ai ajouté un argument insensible à la casse.

updateUrlParameter(url, param, value){
    var regex = new RegExp('(?<=[?|&])(' + param + '=)[^\&]+', 'i');
    // return url.replace(regex, param + '=$1' + value);
    return url.replace(regex, param + '=' + value);
}

Ici (?<=[?|&]) signifie que l'expression régulière correspondra à "?" ou '&' car et prendra la chaîne qui apparaît après le caractère spécifié (regarde derrière le caractère). Cela signifie seulement param1=test1 la sous-chaîne sera mise en correspondance et remplacée.

1
souravb

Je sais que c'est un code un peu sale mais j'ai atteint ce que je cherchais. Il remplace la chaîne de requête donnée ou en ajoute une nouvelle si elle n'existe pas encore.

function updateUrlParameter(url, param, value) {

    var index = url.indexOf("?");

    if (index > 0) {

        var u = url.substring(index + 1).split("&");

        var params = new Array(u.length);

        var p;
        var found = false;

        for (var i = 0; i < u.length; i++) {
            params[i] = u[i].split("=");
            if (params[i][0] === param) {
                params[i][1] = value;
                found = true;
            }
        }

        if (!found) {
            params.Push(new Array(2));
            params[params.length - 1][0] = param;
            params[params.length - 1][1] = value;
        }

        var res = url.substring(0, index + 1) + params[0][0] + "=" + params[0][1];
        for (var i = 1; i < params.length; i++) {
            res += "&" + params[i][0] + "=" + params[i][1];
        }
        return res;

    } else {
        return url + "?" + param + "=" + value;
    }

}

Cela fonctionnera lorsque des adresses URL régulières telles que:

updateUrlParameter('https://www.example.com/some.aspx?mid=1&id=2','id','5');
updateUrlParameter('https://www.example.com/?mid=1&id=2','id','5');
updateUrlParameter('https://www.example.com/some.aspx','id','5');

Veuillez noter Cela ne fonctionnera PAS uniquement si le nom ou la valeur du paramètre de chaîne de requête contient des caractères "=" et/ou "&". Cela fonctionnera très bien derrière cela.

0
Roni Tovi