2014-02-18 2 views
1

В приведенном ниже коде Im не получается правильный результат. Как я могу выполнить сопоставление шаблонов в javascript?Соответствие шаблону в javascript

function getPathValue(url, input) { 
    console.log("this is path key :"+input); 
    url = url.replace(/%7C/g, '|'); 
    var inputarr = input.split("|"); 
    if (inputarr.length > 1) 
     input = '\\b' + inputarr[0] + '\n|' + inputarr[1] + '\\b'; 
    else 
     input = '\\b' + input + '\\b'; 

    var field = url.search(input); 
    var slash1 = url.indexOf("/", field); 
    var slash2 = url.indexOf("/", slash1 + 1); 
    if (slash2 == -1) 
     slash2 = url.indexOf("?"); 
    if (slash2 == -1) 
     slash2 = url.length; 
    console.log("this is path param value :"+url.substring(slash1 + 1, slash2)); 
    return url.substring(slash1 + 1, slash2); 
} 

getPathValue("http://localhost/responsePath/mountainwithpassid|accesscode/100/mountainwithpassid|passid/1","mountainwithpassid|passid") 

Im получая ниже выходные

Если я прохожу mountainwithpassid | accesscode в качестве входных данных Im получая выход в 100. Точно так же, если я прохожу

ключ: mountainwithpassid | passid
значение : 100 // Ожидаемый результат 1

+1

Итак, каков правильный вывод и что именно вы хотите от URL? – turnt

+0

@Cygwinnian, мой вход - mountainwithpassid | passid, который должен возвращать 1 как выход согласно url. – user3180402

ответ

1

Если ваше намерение просто получить значение в пути, который следует за вход (содержащиеся в «/»), то вы может достичь этого с помощью более простого регулярного выражения. Сначала вам понадобится метод, чтобы избежать ввода строки, поскольку он содержит символ канала '|' который переводится как OR в regex.

Вы можете использовать это (взято из https://stackoverflow.com/a/3561711):

RegExp.escape= function(s) { 
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 
}; 

Тогда ваша getPathValue функция может выглядеть примерно так:

function getPathValue(url, input) { 
    var pathValue = null; 
    var escapedInput = RegExp.escape(input); 

    // The RegExp below extracts the value that follows the input and 
    // is contained within '/' characters (the last '/' is optional) 
    var pathValueRegExp = new RegExp(".*" + escapedInput + "/([^/]+)/?.*", 'g'); 

    if (pathValueRegExp.test(url)) { 
    pathValue = url.replace(pathValueRegExp, '$1'); 
    } 
    return pathValue; 
} 

Вы также должны думать о том, как обрабатывать ошибки - в пример возвращает значение null, если совпадение не найдено.

0

Я пытаюсь понять вопрос. Учитывая URL из:

"http://localhost/responsePath/mountainwithpassid|accesscode/100/mountainwithpassid|passid/1" 

и аргумент:

"mountainwithpassid|passid" 

вы ожидаете возвращаемое значение:

"1" 

Аргумент

"mountainwithpassid|accesscode" 

должен вернуться :

"100" 

Это правильно? Если это так (и я не уверен, что это такое), то следующий может удовлетворить:

function getPathValue(url, s) { 
    var x = url.indexOf(s); 
    if (x != -1) { 
     return url.substr(x).split('/')[1]; 
    } 
} 

var url = "http://localhost/responsePath/mountainwithpassid|accesscode/100/mountainwithpassid|passid/1"; 
var x = "mountainwithpassid|passid"; 
var y = "mountainwithpassid|accesscode"; 

console.log(getPathValue(url, x)); // 1 
console.log(getPathValue(url, y)); // 100 
Смежные вопросы