2016-04-01 5 views
1

Я пишу базовый генератор url в JavaScript. У меня есть таблица маршрутизации с регулярными маршрутами. Цель состоит в том, чтобы генерировать 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

Бонус: Нужно ли мне/я могу указать параметры в выражении, чтобы иметь именованные параметры?

+2

Что не так с ''/'+ [1234, "test-stuff"]. Join ('/') '? – Lewis

+1

Зачем использовать регулярное выражение вместо ''/' + parameters.join ('/')'? –

+0

Отредактирован пример маршрута. И другая причина для регулярного выражения заключается в том, что шаблоны маршрутов также используются для проверки. – haxpanel

ответ

0

Спасибо всем за ваши ответы. Я нашел самое близкое решение моей проблемы в generate методы следующего:

https://github.com/gnoesiboe/route-match/blob/master/lib/utility/pathGenerator.js

Он использует путь-к-регулярные выражения библиотеки для извлечения регулярному_выражения из маршрута: https://github.com/pillarjs/path-to-regexp

  • regexp может использоваться для проверки путей
  • requiredRouteParams в методе generate содержит необходимые данные для создания пути от маршрута
0

Вы не должны использовать регулярное выражение в этом случае. Лучше использовать Array.prototype.splice() для настройки вашего parameters, а затем присоединиться к массиву, чтобы получить ожидаемый URL.

var params = [1234, "test-stuff"]; 
 
params.splice(1, 0, 'some-constant-string-here'); 
 
var url = '/' + params.join('/'); 
 
alert(url);

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) { 
 
\t if (typeof(val)!='undefined') this.Base=val; 
 
\t return this.Base; 
 
    } 
 
    this.Target= undefined; 
 
    this.target=function(val) { 
 
\t if (typeof(val)!='undefined') this.Target=val; 
 
\t return this.Target; 
 
    }; 
 
    this.url=function() { 
 
\t if ((typeof(this.Base)!='undefined') && 
 
\t  (typeof(this.Target)!='undefined')) 
 
\t  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>

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]); 
Смежные вопросы