Regex - получить строку запроса без хеша
Нужно иметь возможность передать URL, а регулярное выражение должно быть в состоянии извлечь только строку запроса. Ключевая часть, тем не менее, опускает hashbang и все, что после него.
Это то, что я имею до сих пор, который игнорирует хэш, но все равно получает текст после этого. Это также все еще получает все до первого ?
,
/([^&=#]+)=?([^&#]*)/g
Примечание: я знаю о window.location.search
, но я должен быть в состоянии передать в любой строке URL.
3 ответа
Если вы хотите извлечь части URL из строки, RegExp - неподходящий инструмент для работы. Слишком много странных случаев, и в браузере есть несколько простых встроенных способов анализа URI:
function parseUri(uri) {
var a = document.createElement('a');
a.href = uri;
return {
protocol: a.protocol,
host: a.host,
hostname: a.hostname,
port: a.port,
pathname: a.pathname,
search: a.search,
hash: a.hash
};
}
Этот код не сломается, когда он встретит URI, например:
'http://www.foo.com???#?foo=bar&fizz=buzz#'
И может быть использован для вашего случая как:
parseUri('http://www.foo.com???#?foo=bar&fizz=buzz#').search; // '???'
Чтобы получить строку запроса, этого должно быть достаточно.
\?.*
Если вы хотите быть более конкретным, вы можете попробовать это:
\?(([a-zA-Z]+(=[a-zA-Z])?)&?)+
Первый символ обозначает строку запроса начало (?), За которой следуют пары ключ = значение, принимающие также ключи без значений, которые определены ((=[a-zA-Z])? Отвечает за то, чтобы сделать это необязательным). Это может быть улучшено, но это отправная точка для более сложных вещей. Также обратите внимание, что я предполагаю только значения, состоящие из строчных и прописных букв. Вы можете добавить номера к нему тоже.
Вы не можете использовать регулярные выражения:
var url='http://www.somewhere.com/#something?other&moreStuff';
var index=url.indexOf('#');
var whatIwant = url.substring(index+1);
Или из вашего регулярного выражения:
([^#]+)=?([^&#]*)