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.
a_href = a_href.replace(/(test_ref=)[^\&]+/, '$1' + updated_test_ref);
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);
}
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);
}
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¶m2=test2&anotherparam1=test3
et l'URL mise à jour devrait être comme
http://google.com?param1=newtest¶m2=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.
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.