获取转义的 URL 参数

IT技术 javascript url query-string url-parameters
2021-01-23 05:08:46

我正在寻找一个 jQuery 插件,它可以获取 URL 参数,并支持这个搜索字符串而不输出 JavaScript 错误:“格式错误的 URI 序列”。如果没有支持此功能的 jQuery 插件,我需要知道如何修改它以支持此功能。

?search=%E6%F8%E5

URL 参数的值在解码时应为:

æøå

(字符是挪威语)。

我无权访问服务器,因此无法对其进行任何修改。

6个回答
function getURLParameter(name) {
    return decodeURI(
        (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]
    );
}
这个函数在没有定义参数时返回'null'而不是null......js的乐趣......
2021-03-11 05:08:46
这很好,但 decodeURIComponent 更好,例如,我的参数中有一个主题标签 (%23),decodeURI 会忽略它。而且我不会返回null,而是"",因为decodeURI(null) === "null",这是一个奇怪的返回值,"" 更好;你可以做 if (!getURLParameter("param")) 而不是 if (getURLParameter("param") === "null")。所以,我的改进版本: decodeURIComponent( (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,""])[1] )
2021-03-24 05:08:46
您可能需要“decodeURIComponent()”而不是“decodeURI()”,尤其是当您将有趣的数据(如返回 URL)作为 URL 参数传入时
2021-03-25 05:08:46
有了name = 'bar',我认为这个正则表达式会匹配'foobar=10'并返回'10'也许您可以'[?|&]'在正则表达式的开头添加干杯!
2021-03-26 05:08:46
否决投票,因为无论是否找到结果,这都会返回字符串,并且无论您将什么作为替代数组(例如 [,null]),因为结果被包装在 decodeURI 中,将任何内容都变成了字符串,Sanjeev 是对的,但他的代码没有正确测试,简单的复制和粘贴不起作用。 function getURLParameter(name) { var p = RegExp(name + '=' + '(.+?)(&|$)').exec(location.search); if(!!p) { p = decodeURI(p[1]); } return p; }
2021-03-30 05:08:46

以下是我根据此处的评论创建的内容,以及修复未提及的错误(例如实际返回 null,而不是“null”):

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}
@Redbeard - 你的函数不应该在方法定义后有一个 '=' 符号而不是双冒号吗?
2021-03-11 05:08:46
这应该是公认的答案。获得真正的空值而不是“空值”要好得多。
2021-03-14 05:08:46
如果有人需要将其转换为咖啡脚本: getURLParameter: (name) -> return decodeURIComponent((new RegExp("[?|&]#{name}=([^&;]+?)(&|##|;|) $)").exec(location.search) || [null,""] )[1].replace(/\+/g, '%20'))||null;
2021-03-17 05:08:46
这是唯一一个适用于我的 UTF8 字符串的 get-URL-parameter 函数版本。
2021-03-17 05:08:46
new在 RegExp 前面添加怎么样更少的棉绒警告。
2021-03-20 05:08:46

您真正想要的是jQuery URL Parser 插件使用此插件,获取特定 URL 参数的值(对于当前 URL)如下所示:

$.url().param('foo');

如果你想要一个以参数名称作为键和参数值作为值的对象,你只需要不param()带参数地调用,就像这样:

$.url().param();

该库还适用于其他网址,而不仅仅是当前的网址:

$.url('http://allmarkedup.com?sky=blue&grass=green').param();
$('#myElement').url().param(); // works with elements that have 'src', 'href' or 'action' attributes

由于这是一个完整的 URL 解析库,您还可以从 URL 中获取其他信息,例如指定的端口,或者路径、协议等:

var url = $.url('http://allmarkedup.com/folder/dir/index.html?item=value');
url.attr('protocol'); // returns 'http'
url.attr('path'); // returns '/folder/dir/index.html'

它还具有其他功能,请查看其主页以获取更多文档和示例。

与其为这个大多数情况下都可以工作的特定目的编写自己的 URI 解析器,不如使用实际的 URI 解析器。根据答案,来自其他答案的代码可以返回而不是,不适用于空参数 ( ),无法一次解析和返回所有参数,如果重复查询参数的 URL 则重复工作等。'null'null?foo=&bar=x

使用实际的 URI 解析器,不要自己发明。

对于那些不喜欢 jQuery 的人,有一个纯 JS 版本的插件

问题是“使用 jQuery 获取 URL 参数”。我的回答回答了这个问题。其他答案指示用户基本上为这个特定用例编写自己的 URI 解析器,这是一个糟糕的主意。解析 URI 比人们想象的要复杂。
2021-03-11 05:08:46
插件是处理 URI 编码还是我必须手动解码?
2021-03-20 05:08:46
这是我一直在寻找的答案,与其他一些答案不同,它非常具有 jQuery 风格。
2021-04-01 05:08:46
问题是“javascript”(我认为它直接表示 DOM)或 jQuery。所以其他任何人都可以。
2021-04-06 05:08:46

如果您不知道 URL 参数是什么,并且想要获取包含参数中的键和值的对象,则可以使用以下命令:

function getParameters() {
  var searchString = window.location.search.substring(1),
      params = searchString.split("&"),
      hash = {};

  if (searchString == "") return {};
  for (var i = 0; i < params.length; i++) {
    var val = params[i].split("=");
    hash[unescape(val[0])] = unescape(val[1]);
  }
  return hash;
}

使用类似的 url 调用 getParameters()/posts?date=9/10/11&author=nilbus将返回:

{
  date:   '9/10/11',
  author: 'nilbus'
}

我不会在这里包含代码,因为它离问题更远,但是weareon.net 发布了一个库,它也允许操作 URL 中的参数:

这个函数返回一个笨拙的对象:{"": undefined}当 URL 没有参数时。最好if(searchString=='') return {};searchString赋值后直接使用 using 返回一个空对象
2021-03-11 05:08:46
是的,这更好地获取所有参数。此处列出的所有其他解决方案对每个参数重复正则表达式。
2021-03-26 05:08:46

您可以使用浏览器本机location.search属性:

function getParameter(paramName) {
  var searchString = window.location.search.substring(1),
      i, val, params = searchString.split("&");

  for (i=0;i<params.length;i++) {
    val = params[i].split("=");
    if (val[0] == paramName) {
      return unescape(val[1]);
    }
  }
  return null;
}

但是有一些 jQuery 插件可以帮助您:

我建议使用 decodeURIComponent() 而不是 unescape()
2021-03-15 05:08:46
+1 这适用于现代浏览器,但一些开发人员需要使用...:| IE8:S。
2021-03-28 05:08:46
这比所有那些正则表达式单行代码更清晰、更具可读性(并且可能更无错误)。
2021-04-07 05:08:46