我正在用JavaScript编写基本的url生成器。我有一个带有正则表达式路由的路由表。目标是根据给定的正则表达式模式和参数生成url。
例如,我有以下模式:
var route = /\/([0-9]{4})\/some-constant-string-here\/([a-z-]+)/i
使用以下参数:
var parameters = [1234, "test-stuff"];
如何将参数应用于模式以获取此信息:/1234/some-constant-string-here/test-stuff
额外奖励:我是否需要/我可以在表达式中命名参数以获得命名参数吗?
答案 0 :(得分:0)
在这种情况下你不应该使用正则表达式。最好使用Array.prototype.splice()
自定义parameters
,然后加入数组以检索预期的网址。
var params = [1234, "test-stuff"];
params.splice(1, 0, 'some-constant-string-here');
var url = '/' + params.join('/');
alert(url);

答案 1 :(得分:0)
当您谈到命名参数时,可以通过创建函数来实现:
function makUrl(obj) {
return '/'+obj.base+'/some-constant-string-here/'+obj.target;
}
var route = makUrl({base:'1234',target:'test-stuff'});
或许,您想要创建一个特定的对象:
var route = function() {
this.Base = '0000';
this.base=function(val) {
if (typeof(val)!='undefined') this.Base=val;
return this.Base;
}
this.Target= undefined;
this.target=function(val) {
if (typeof(val)!='undefined') this.Target=val;
return this.Target;
};
this.url=function() {
if ( (typeof(this.Base)!='undefined') &&
(typeof(this.Target)!='undefined'))
return '/'+this.Base+'/some-constant-string-here/'+this.Target;
};
}
function println(val) { sample.innerHTML+=val+"<br>"; }
var rt01 = new route;
println( rt01.base() );
println( rt01.target() );
println( rt01.url() );
rt01.base(1234);
rt01.target('test-stuff');
println("...");
println( rt01.base() );
println( rt01.target() );
println( rt01.url() );
#sample {font-family:mono;}
<div id="sample"> </div>
答案 2 :(得分:0)
我猜这个可以完成你的工作。首先验证两个参数然后构造url。
var parameters = [1234, "test-stuff"],
text = "some-constant-string-here",
url = "";
/\d{4}/.test(parameters[0]) &&
/[a-z-]+/.test(parameters[1]) &&
(url = "/" + parameters[0] + "/" + text + "/" + parameters[1]);
答案 3 :(得分:0)
感谢大家的回答。我在以下generate
方法中找到了最接近我问题的解决方案:
https://github.com/gnoesiboe/route-match/blob/master/lib/utility/pathGenerator.js
它使用path-to-regexp库从路由中提取regexp: https://github.com/pillarjs/path-to-regexp
requiredRouteParams
方法中的generate
包含从路径构建路径所需的数据