【问题标题】:Regex - Get query string without hash正则表达式 - 获取没有哈希的查询字符串
【发布时间】:2015-06-26 15:46:45
【问题描述】:

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

这是我到目前为止所拥有的,它忽略了哈希,但之后仍然会得到文本。在第一个 ? 之前它仍然可以获取所有内容。

/([^&=#]+)=?([^&#]*)/g

注意:我知道window.location.search,但我需要能够传入任何 URL 字符串。

【问题讨论】:

  • 为什么不获取 indexOf # 然后从那里 +1 到末尾的子字符串?

标签: javascript regex url query-string fragment-identifier


【解决方案1】:

你不能使用正则表达式:

var url='http://www.somewhere.com/#something?other&moreStuff';
var index=url.indexOf('#');
var whatIwant = url.substring(index+1);

或来自您的正则表达式:

([^#]+)=?([^&#]*)

【讨论】:

  • 您的第一个代码块获取的是哈希值,而不是查询字符串。
【解决方案2】:

如果您想从字符串中提取 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; // '???'

【讨论】:

    【解决方案3】:

    要获取查询字符串,这个就足够了。

    \?.*
    

    如果你想更具体,你可以试试这个:

    \?(([a-zA-Z]+(=[a-zA-Z])?)&?)+
    

    第一个字符标记查询字符串的开始 (?),然后是 key=value 对,也接受没有值定义的键((=[a-zA-Z])? 负责使其成为可选)。它可能会有所改进,但它是更复杂事物的起点。另外,请注意,我假设仅由大小写字母组成的值。你也可以添加数字。

    【讨论】:

    • 正如您所说,'并且正则表达式应该能够仅提取 查询字符串'。查询字符串不包括 # 部分。这称为片段。因此,根据您的要求,我的正则表达式确实有效。
    • 'http://www.example.com#lorem?ipsum&dolor'的查询字符串部分是''
    • @zzzzBov 很抱歉恢复 2-yo 讨论,但 Reuel 所说的您的样本无效。查询字符串将被视为 URL 的一部分,因此必须出现在哈希之前,而不是之后。在您的示例中,问号是片段的一部分,而不是 URL 的一部分,因此被解释。反向(不正确)的方式也会破坏标准 API,如 window.history.pushstate。
    • @GregPettit,我的意思是哈希可能包含 ? 字符,并且提供的正则表达式没有考虑到这一事实。 “查询字符串......必须在哈希之前”如果我之前不清楚,我的预期输出是如果哈希包含看起来类似于查询字符串的内容,则查询字符串为空。提供的正则表达式在此失败。 “反向(不正确)的方式也会破坏标准 API,如 window.history.pushstate”,如果你能向我展示这种行为的 minimal reproducible example,我会很感兴趣,因为那将是一个浏览器错误。
    • 等等,所以你的评论的意思是,“它应该是空字符串”?然后我同意了,我说话不顺眼。道歉!对于第二部分,这很容易。转到没有 URL 重写系统的任何网站,并使用散列和无序查询字符串重新加载页面。然后在控制台中输入window.history.pushState({}, "thing", "#bar") 并观察您放置不正确的查询字符串消失。将顺序设置为正确,运行相同的测试,并仅见证正在更新的哈希。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2017-03-18
    • 1970-01-01
    • 2023-03-31
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多