2016-02-17 2 views
0

Я использую JavaScript .split() для разделения параметров URL.Regex: соответствие «&» только в том случае, если рядом с буквенно-цифровыми символами

Можно ли использовать Regex для сопоставления & тогда и только тогда, когда он существует рядом с буквенно-цифровыми символами?

Пример:

Не Match:?category=Health+&+Wellness

Match: ?category=Health&Wellness

Не соответствует первому, соответствует второму:?category=Health+&+Wellness&tag=Diet

Я используя сценарий, который вытягивает параметры из URL-адреса из атрибута data-url в моем веб-шаблоне. Это фрагмент сценария параметров.

var query = decodeURIComponent(str).match(/[#|?].*$/g), 
      ret = {}; 

     if (query) { 
      query = query[ 0 ].replace(/^\?|^#|^\/|\/$|\[|\]/g, ""); 
      query = query.split("&"); 

      for (var i = query.length; i--;) { 
       var pair = query[ i ].split("="), 
        key = pair[ 0 ], 
        val = pair[ 1 ]; 

       if (ret[ key ]) { 
        if ({}.toString.call(ret[ key ]) !== "[object Array]") { 
         ret[ key ] = [ ret[ key ] ]; 
        } 

        ret[ key ].push(val); 

       } else { 
        ret[ key ] = val; 
       } 
      } 
     } 

Проблема с моим текущим кодом в split() линии. Сейчас он разбивает параметры вроде Health+&+Wellness, которых я не хочу.

+0

' & 'сохраняется в формате URI. Вы должны либо urlencode uri's, то «Health & Wellness» станет чем-то вроде категории? = Health +% 26 + Wellness' или замените его чем-то другим, например '? Category = Health + и + Wellness' и преобразуйте его обратно и вперед. – ankhzet

+0

Я думаю, вам нужно '/ \ b & \ b/g' (если alphanum и' _' должны быть с обеих сторон) или '/ \ b & | & \ b/g' (если словальные символы требуются только с одной стороны) –

+2

Что делать, если я пробую эту категорию: 'm & m's'? – zessx

ответ

0

Возможное решение, предварительно отформатированные URI:

var query = decodeURIComponent(str).replace(/&([^&=]+(&[^&=]+=|$))/, '%26$1'); 

Результат:

> query = "?category=Health+&+Wellness&tag=Diet" 
> query.replace(/&([^&=]+(&[^&=]+=|$))/, '%26$1') 
< "?category=Health+%26+Wellness&tag=Diet" 

Примечание: Я настоятельно рекомендую, чтобы отладить код и посмотреть, как str выглядит как раньше это decodeURIComponent -ed

> str 
< "?category=Health+%26+Wellness&tag=Diet" // no & 
> decodeURIComponent(str) 
< "?category=Health+&+Wellness&tag=Diet" // & instead of %26 

Таким образом, его можно, что URI conponents должен быть decodeURIComponent -ed после Ури рассек split('&')

0

Не называйте decodeURIComponent на всю строку только на ключ и значение после того, как вы разделяете:

var query = str.match(/[#|?].*$/g), 
     ret = {}; 

    if (query) { 
     query = query[ 0 ].replace(/^\?|^#|^\/|\/$|\[|\]/g, ""); 
     query = query.split("&"); 

     for (var i = query.length; i--;) { 
      var pair = query[ i ].split("="), 
       key = decodeURIComponent(pair[ 0 ]), 
       val = decodeURIComponent(pair[ 1 ]); 

      if (ret[ key ]) { 
       if ({}.toString.call(ret[ key ]) !== "[object Array]") { 
        ret[ key ] = [ ret[ key ] ]; 
       } 

       ret[ key ].push(val); 

      } else { 
       ret[ key ] = val; 
      } 
     } 
    }