2012-03-07 2 views
0

Я пытаюсь заменить переменную GET URL, однако регулярное выражение для проверки того, существует ли переменная в числе других переменных GET, возвращает true, когда я ожидаю, что она вернется ложный.Regex - шаблон регулярного выражения, не соответствующий URL-адресу. Параметр GET

Узор я использую: &sort=.*&

Test URL: http://localhost/search?location=any&sort=asc

Правильно ли я верить, что эта модель должна быть возвращение ложным на том основании, что их нет амперсанда следующее значение параметра Сортировать по ?

Полный код:

var sort = getOptionValue($(this).attr('id')); 
var url = document.URL; 

if(url.indexOf('?') == -1) { 
    url = url+'?sort='+sort; 
} else { 
    if(url.search('/&sort=.*&/i')) { 
     url.replace('/&sort=.*&/i','&sort='+sort+'&'); 
    } 
    else if(url.search('/&sort=.*/i')) { 
     url.replace('/&sort=.*/i','&sort='+sort); 
    } 
} 

ответ

1

Правильно ли я верить, что эта модель должна быть возвращение ложным на том основании, что их нет амперсанда следующее значение параметра Сортировать по?

Ну, вы используете String.search, который, согласно документации, связанной:

В случае успешного поиска возвращает индекс регулярного выражения внутри строки. В противном случае он возвращает -1.

Так он будет возвращать -1 или 0 или больше при наличии совпадения. Поэтому вы должны проверить на -1, а не на правду.

Кроме того, нет необходимости проходить регулярные выражения как строки, вы можете также использовать:

url.replace(/&sort=.*&/i,'&sort='+sort+'&'); 

Кроме того, имейте в виду, что replace создаст новую строку, а не заменить в строке (строки в Javascript неизменяемы).

Наконец, я не вижу необходимости для поиска строки, а затем заменить его - кажется, что вы всегда хотите заменить &sort=SOMETHING с &sort=SOMETHING_ELSE, так просто сделать:

if(url.indexOf('?') == -1) { 
    url = url+'?sort='+sort; 
} else { 
    url = url.replace(/&sort=[^&]*/i, '&sort=' + sort); 
} 
+0

Совершенных. Спасибо за помощь Линуса. – Stibily

0

Javascript строка функция search() возвращает -1, если не найден, а не ложь. Ваш код должен прочитать:

if(url.search('/&sort=.*&/i') != -1) { 
    url.replace('/&sort=.*&/i','&sort='+sort+'&'); 
} 
else if(url.search('/&sort=.*/i') != -1) { 
    url.replace('/&sort=.*/i','&sort='+sort); 
} 
0

Вы следует проверить

if(url.search('/&sort=.*&/i') >= 0) 

, то он должен работать

0

Вы можете использовать этот код

var url = 'http://localhost/search?location=any&sort=asc'; 
var vars = {}; 
    var parts = url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { 
     vars[key] = value; 
    }); 
console.log(vars); 
//vars is an object with two properties: location and sort 
0

Это может быть сделано с помощью

url.replace(/([?&])(sort=)([^&?]*)/, "$1$2" + sort); 

Матч с разбивкой

Группа 1 по поиску?или & Группа 2 совпадения сортировка = Группа 3 соответствует всем, что не является & или?

Тогда "$ 1 $ 2" + сорт заменит все 3 матча группового этапа с первыми 2 + ваша переменная

примеры с использованием строки "ЗАМЕНА" вместо своего рода переменной

url = "http://localhost/search?location=any&sort=asc&a=z" 
url.replace(/([?&])(sort=)([^&?]*)/, "$1$2" + "REPLACE"); 
// => "http://localhost/search?location=any&sort=REPLACE&a=z" 

url = "http://localhost/search?location=any&sort=asc" 
url.replace(/([?&])(sort=)([^&?]*)/, "$1$2" + "REPLACE"); 
// => "http://localhost/search?location=any&sort=REPLACE" 

url = "http://localhost/search?sort=asc" 
url.replace(/([?&])(sort=)([^&?]*)/, "$1$2" + "REPLACE"); 
// => "http://localhost/search?sort=REPLACE" 

url = "http://localhost/search?sort=asc&z=y" 
url.replace(/([?&])(sort=)([^&?]*)/, "$1$2" + "REPLACE"); 
// => "http://localhost/search?sort=REPLACE&z=y" 
0

Узор Я использую: &sort=.*& Тестовый URL: http://localhost/search?location=any&sort=asc Имею ли я право полагать, что этот шаблон должен возвращать false на основе того, что у них нет символа амперсанда после сортировки Значение параметра?

Вы принимаете на себя право. Но в вашем коде у вас есть else if(url.search('/&sort=.*/i')), который будет соответствовать и, таким образом, все равно заменить значение.

Вы также должны отметить, что ваш код превратит http://localhost/search?sort=asc&location=any&some=more в http://localhost/search?sort=asc&some=more. это потому, что .* жадный (пытаясь как можно больше совместить). Вы можете избежать этого, сообщив ему, чтобы он как можно меньше присоединился, добавив? подобный поэтому .*?.

Это, я считаю, вам может быть лучше с библиотекой, которая знает, как действительно работают URL-адреса. Вы не компенсируя позицию параметров, возможных уцелевших ценности и т.д. Я предлагаю вам взглянуть на URI.js и заменить злое регулярное выражение с

var uri = URI(document.URL), 
    data = uri.query(true); 

data.foo = 'bazbaz'; 
uri.query(data); 
Смежные вопросы