regex 用正则表达式替换URL中的参数

dkqlctbz  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(70)

我想用特定的id替换URL字符串中的“:id”,例如54我的问题是使用“/(:id)/i”替换此参数是否足够,或者我应该使用更复杂的东西?谢谢

var url = "http://www.test.com/api/person/:id/details"
var str = url.replace(/(:id)/i, 54);

字符串
更新日期:
我刚刚意识到,这将是伟大的,有一个功能,将能够取代多个值的URL.示例:

function replaceParametersInUrl(url, params) {
  var regex = new RegExp(Object.keys(params).join('|'), 'gi');
    return url.replace(regex, function(matched) {
    return params[matched];
  });
}

console.log(replaceParametersInUrl("api/person/:userId/items/:itemId",  {userId: 56, itemId: 1}));


这个解决方案的问题是,它只替换了userId和itemId字符串,而没有“:“。我如何才能实现它将替换包括“:“在内的那些字符串?

uinbv5nw

uinbv5nw1#

我写这个函数是为了解决我在更新的问题中提到的问题:

function replaceParametersInUrl(url, params) {
  var newObj = {};
  Object.keys(params).forEach(function(key) {
    newObj[':'+key] = params[key];
  });

  var regex = new RegExp(Object.keys(newObj).join('|'), 'gi');
  return url.replace(regex, function(matched) {
    return newObj[matched];
  });
}

console.log(replaceParametersInUrl("api/person/:userId/items/:itemId", {userId: 56, itemId: 1}));

字符串
我可以在对象键中使用“:“字符吗?

jobtbby3

jobtbby32#

在“正常”的情况下,它应该足够了。用户可以输入:id:Id,但你已经使用了incasesensitive标志,所以它应该没问题。
但是你是那个应该知道它是否足够的人。也许在你的应用程序中有一个情况,在你想要替换的那个之前有一个:id。然后你就有了上面给出的RegExp的问题。

t5fffqht

t5fffqht3#

您提供的代码将正常工作。此外,添加到您的代码中,括号不尼德在这里(:id)。此外,如果URL中的任何地方都有:id,您的正则表达式将失败(虽然不是预期的,但开发人员应该小心)。
修改代码:

var url = "http://www.test.com/api/person/:id/details";
var str = url.replace(/\/:id\//i, '/54/');

字符串

inb24sb2

inb24sb24#

我想到的另一个解决办法。

const replaceParametersInUrl = (url, params) =>
  url.replace(/:(\w+)/g, (match, group) => {
    if (!params[group]) throw new Error(`Unable to find value for ${match} param`);
    return `${params[group]}`;
  });

字符串

相关问题