Javascript Regex-获取不带哈希的查询字符串
需要能够传入URL,并且正则表达式应该能够仅提取查询字符串。但关键的部分是省略hashbang及其后的任何内容 这就是我到目前为止得到的结果,它忽略了散列,但之后仍然会得到文本。它还可以在第一个之前得到一切 /[^&=]+=?[^&]*/gJavascript Regex-获取不带哈希的查询字符串,javascript,regex,url,query-string,fragment-identifier,Javascript,Regex,Url,Query String,Fragment Identifier,需要能够传入URL,并且正则表达式应该能够仅提取查询字符串。但关键的部分是省略hashbang及其后的任何内容 这就是我到目前为止得到的结果,它忽略了散列,但之后仍然会得到文本。它还可以在第一个之前得到一切 /[^&=]+=?[^&]*/g 注意:我知道window.location.search,但我需要能够传入任何URL字符串。您不能使用正则表达式: var url='http://www.somewhere.com/#something?other&moreStuff'; var
注意:我知道window.location.search,但我需要能够传入任何URL字符串。您不能使用正则表达式:
var url='http://www.somewhere.com/#something?other&moreStuff';
var index=url.indexOf('#');
var whatIwant = url.substring(index+1);
或者从您的正则表达式:
([^#]+)=?([^&#]*)
如果要从字符串中提取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])?)&?)+
第一个字符标记查询字符串的开始,后面是一对key=value接受键,也接受没有值的键定义了=[a-zA-Z]?负责使其成为可选的。它可能会得到改进,但它是更复杂事情的起点。另外,请注意,我只假设由小写和大写字母组成的值。您也可以向其中添加数字。为什么不先获取indexOf,然后再获取从+1到结尾的子字符串?您的第一个代码块将获取哈希值,而不是查询字符串。正如您所说,“正则表达式应该能够仅提取查询字符串”。查询字符串不包括零件。这叫做片段。因此,根据您的要求,我的正则表达式确实有效http://www.example.comlorem?ipsum&dolor'是。@zzbov很抱歉再次引发2-yo讨论,但您的示例无效,这正是Reuel所说的。查询字符串将被视为URL的一部分,因此必须位于哈希之前,而不是之后。在您的示例中,问号是片段的一部分,而不是URL的一部分,因此会进行解释。相反的错误方式也会破坏标准API,如window.history.pushstate。@GregPettit,我的观点是哈希可能包含?字符,并且提供的正则表达式不能解释这一事实。查询字符串。。。如果我之前不清楚,那么我的预期输出是,如果哈希包含类似于查询字符串的内容,则查询字符串将为空。提供的正则表达式在这一点上失败。相反的错误方式也会破坏window.history.pushstate等标准API。如果您能告诉我这种行为的详细信息,我会很感兴趣,因为这将是一个浏览器错误。等等,您的评论的意思是,它应该是空字符串?然后我同意了,而且我说话不按顺序。道歉!第二部分很简单。转到没有URL重写系统的任何网站,并使用哈希和无序查询字符串重新加载页面。然后在控制台中输入window.history.pushState{},thing,bar,然后看着错误放置的查询字符串消失。将顺序设置为正确,运行相同的测试,并仅见证正在更新的哈希。