Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Regex-获取不带哈希的查询字符串_Javascript_Regex_Url_Query String_Fragment Identifier - Fatal编程技术网

Javascript Regex-获取不带哈希的查询字符串

Javascript 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

需要能够传入URL,并且正则表达式应该能够仅提取查询字符串。但关键的部分是省略hashbang及其后的任何内容

这就是我到目前为止得到的结果,它忽略了散列,但之后仍然会得到文本。它还可以在第一个之前得到一切

/[^&=]+=?[^&]*/g


注意:我知道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,然后看着错误放置的查询字符串消失。将顺序设置为正确,运行相同的测试,并仅见证正在更新的哈希。