2013-08-27 4 views
1

Вот что я пытался решить ...Как получить значение параметра внутри строки?

У нас есть некоторые данные из вызова ajax, а данные результата находятся между другими вещами огромной строкой с данными ключа: value. Например:

"2R = OK | 2M = найдено 2 строки (ей) | V1 = 1,2 |"

Возможно ли для js сделать что-то вроде: var value = someFunction (str, param);

так, если я искать параметр «V1» вернет «1,2»

Я получил это не работает на сервере Sql не пот, но я борюсь с JS для разбора строки.

До сих пор я в состоянии сделать это ОЧЕНЬ зачаточном цикл, как это:

var str = "2R=OK|2M=2 row(s) found|V1=1,2|"; 
var param = "V1"; 
var arr = str.split("|"); 
var i = 0; 
var value = ""; 
for(i = 0; i<arr.length; ++i){ 
    if(arr[i].indexOf(param)>-1){ 
     value = arr[i].split("=")[1]; 
    } 
} 
console.log(value); 

если я положил, что в функции она работает, но мне интересно, если есть более эффективный способ сделать это, может быть, какое-то регулярное выражение? но я сосать его. Надеюсь, кто-нибудь может рассказать мне об этом?

Спасибо!

ответ

1

Это должно работать для вас, и это разделители могут быть сконфигурированы (если вы хотите, чтобы разобрать подобную строку с различными разделителями, вы можете просто передать в ограничители в качестве аргументов):

var parseKeyValue = (function(){ 

    return function(str, search, keyDelim, valueDelim){ 
    keyDelim = quote(keyDelim || '|'); 
    valueDelim = quote(valueDelim || '='); 

    var regexp = new RegExp('(?:^|' + keyDelim + ')' + quote(search) + valueDelim + '(.*?)(?:' + keyDelim + '|$)'); 
    var result = regexp.exec(str); 

    if(result && result.length > 1) 
     return result[1]; 
    }; 

    function quote(str){ 
    return (str+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); 
    } 
})(); 

Quote function borrowed form this answer

примеры использования:

var str = "2R=OK|2M=2 row(s) found|V1=1,2|"; 
var param = "V1"; 
parseKeyValue(str, param); // "1,2" 

var str = "2R=OK&2M=2 row(s) found&V1=1,2"; 
var param = "2R"; 
parseKeyValue(str, param, '&'); // "OK" 

var str = 
"2R=>OK\n\ 
2M->2 row(s) found\n\ 
V1->1,2"; 

var param = "2M"; 
parseKeyValue(str, param, '\n', '->'); // "2 row(s) found" 
+0

Спасибо за помощь, @David избил вас, но ваша помощь очень ценится! –

+0

Хорошо, извините за задержку, но это правильный способ сделать это, независимо от того, сколько параметров находится внутри строки, эта функция даст вам желаемое значение параметра и ничего больше. Хэт подскажет вам, сэр @Paulpro, ты указал мне на некоторые интересные вещи прямо там. –

2

Это похоже на работу для конкретного сценария использования:

function getValueByKey(haystack, needle) { 
    if (!haystack || !needle) { 
     return false; 
    } 
    else { 
     var re = new RegExp(needle + '=(.+)'); 
     return haystack.match(re)[1]; 
    } 
} 

var str = "2R=OK|2M=2 row(s) found|V1=1,2|", 
    test = getValueByKey(str, 'V1'); 
console.log(test); 

JS Fiddle demo.

И, чтобы включить разделитель в вашем поиске (в целях предотвращения somethingElseV1 соответствия для V1):

function getValueByKey(haystack, needle, separator) { 
    if (!haystack || !needle) { 
     return false; 
    } 
    else { 
     var re = new RegExp('\\' + separator + needle + '=(.+)\\' + separator); 
     return haystack.match(re)[1]; 
    } 
} 

var str = "2R=OK|2M=2 row(s) found|V1=1,2|", 
    test = getValueByKey(str, 'V1', '|'); 
console.log(test); 

JS Fiddle demo.

Обратите внимание, что этот подход требует использования конструктора new RegExp() (вместо создания регулярного выражения с использованием /.../), чтобы передать переменные в регулярное выражение.

Аналогично, потому что мы используем строку для создания регулярного выражения внутри конструктора, нам нужно дважды уйти от символов, которым требуется экранирование (экранирование сначала внутри строки, а затем экранирование внутри созданного RegExp).

Ссылки:

+0

Nice! спасибо, но есть небольшая деталь, если searchString что-то вроде этого «2R = OK | 2M = 2 строки (ы) найдено | V1 = 1,2 | V2 = Test |" и я использую ваш метод, ищущий значение V1, я получаю «1,2 | V2 = Test |» есть способ сказать регулярному выражению перестать смотреть за трубой «|» найден? –

+0

oh Snap! вы избили меня, второй - тот! спасибо большому приятелю, я должен тебе холодный. Мне нужно поправляться в регулярном выражении, так как я сохраняю много времени и кодирования, так как я помню, но я не в этом разбираюсь. Спасибо за ссылки! –

+0

Дэвид благодарит вас за помощь, эта функция доходит до того, что я могу сказать очень мощный, но не имеет некоторых важных деталей, то есть возвращает только значение данного параметра, действительно ищет параметр и получает его значение, а также возвращает остаток строки из найденного параметра. Ссылки, которые вы отправили, были большой помощью, очень ценили, но метод @ Paul - тот, который я буду реализовывать в своем файле утилиты с некоторыми настройками, когда я получу освоение всей этой сладости регулярных выражений. Благодаря! –

0

Here другой подход:

HTML:

<div id="2R"></div> 
<div id="2M"></div> 
<div id="V1"></div> 

Javascript:

function createDictionary(input) { 
    var splittedInput = input.split(/[=|]/), 
     kvpCount = Math.floor(splittedInput.length/2), 
     i, key, value, 
     dictionary = {}; 

    for (i = 0; i < kvpCount; i += 1) { 
     key = splittedInput[i * 2]; 
     value = splittedInput[i * 2 + 1]; 
     dictionary[key] = value; 
    } 
    return dictionary; 
} 

var input = "2R=OK|2M=2 row(s) found|V1=1,2|", 
    dictionary = createDictionary(input), 
    div2R = document.getElementById("2R"), 
    div2M = document.getElementById("2M"), 
    divV1 = document.getElementById("V1"); 

div2R.innerHTML = dictionary["2R"]; 
div2M.innerHTML = dictionary["2M"]; 
divV1.innerHTML = dictionary["V1"]; 

Результат:

OK 
2 row(s) found 
1,2 
+0

Интересный подход, но я думаю, что он немного медленен при работе с длинными строками, в моем случае я могу получить до 80 параметров на строке (не вентилятор, а требование), и цикл, который вы делаете, в основном такой же, как мой первоначальный подход , Спасибо mate за некоторые интересные советы и этот словарь, который вы там сделали, очень удобно, может быть, я возьму часть этой концепции для своих собственных –

+0

@SamCcp. Добро пожаловать :) – kol

Смежные вопросы