Regex для извлечения переменных и значений строки запроса - PullRequest
1 голос
/ 22 сентября 2009

Я использую Javascript и пытаюсь отделить переменные строки запроса от их значений. Я сделал регулярное выражение, которое прекрасно работает, ЕСЛИ нет других амперсандов, кроме обозначенных переменных, в противном случае данные обрезаются на амперсанде.

пример: ajax=10&a=test&b=cats & dogs возвращает a = "test", b = "cats "

Я не могу закодировать амперсанды перед созданием строки из-за характера этого проекта и неэффективности кодирования / замены символов в сотнях мест при входе.

В конечном итоге этот фрагмент кода должен превратить строку запроса ajax=10&a=cats & dogs в ajax=10&a=cats%20%26%20dogs

list = [ 'ajax','&obj','&a','&b','&c','&d','&e','&f','&g','&h','&m' ];
ajax_string = '';
for (var i=0, li=list.length; i<li; i++) {
    variables = new RegExp(list[i] +"=([^&(.+)=]*)");
    query_string = variables.exec(str);
    if (query_string != null) {
        alert(query_string);
    }
}

Ответы [ 2 ]

3 голосов
/ 22 сентября 2009

Строка запроса должна быть разделена на амперсанды. Любые амперсанды в значениях фактических аргументов должны быть преобразованы в% 26.

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

ajax=10&a=test&b=cats+%26+dogs

Строка запроса, которую вы отправили , должна дать вам это:

'ajax':  '10'
'a':     'test'
'b':     'cats '
' dogs': ''

Редактировать

Похоже, вы действительно хотите очистить строку запроса, которую другие разработчики лениво построили. Если предположить, что: a) имя каждого аргумента соответствует / [a-zA-Z0-9] + /; и б) за ним всегда следует знак равенства, тогда этот код будет работать:

var queryString = 'ajax=10&a=test&b=cats & dogs';
var parts = queryString.split(/&(?=[a-zA-Z0-9]+\=)/);
for(var i = 0; i < parts.length; i++)
{
  var index = parts[i].indexOf('=') + 1;
  if(index > 0)
    parts[i] = parts[i].substring(0, index) + escape(parts[i].substring(index));
  //else: error?
}
queryString = parts.join("&");
alert("queryString: " + queryString);
1 голос
/ 22 сентября 2009

> Я не могу закодировать амперсанды до создания строки из-за характера этого проекта

Тогда у тебя не будет полного ответа.

Амперсанды ("&") разделяют параметры запроса в строках URL-запроса . У вас не может быть обоих способов, когда некоторые из ваших значений параметров запроса содержат неэкранированные "&" и ожидают, что разборщик, основанный на этом простом правиле, узнает разницу.

Если вы не можете экранировать "&" как "%26" в каждом компоненте значения заранее, то вы никогда не сможете знать , что полученные вами значения верны. Лучшее, что вы можете сделать: если значение справа от "&" и до следующего "&" не не содержит знак равенства "=", вы добавляете значение к предыдущему значению, считанному или пустая строка, если это первое прочитанное значение.

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

Обратите внимание, что подобный алгоритм полностью обходит спецификацию. Предполагая на мгновение, что строка запроса:

a=test&b=cats & dogs&c=test

допустимо, технически эта строка содержит 4 параметров: "a" (со значением "test"), "b" (со значением "cats "), " dogs" (с без значения) и "c" (со значением "test").

Если вы не изменили строку запроса в источнике (и правильно экранировали компонент value), вы просто взломали неправильное решение.

Удачи.

...