如何使用正则表达式从URL解析GET标记

时间:2013-06-06 23:47:58

标签: regex url

给定带有GET参数的URL,例如

http://www.domain.com?key1=value1+value2+value3&key2=value4+value5

我希望捕获给定键的所有值(如果可能的话,捕获到单独的引用中)。例如,如果所需的密钥为key1,我想要在\ 1中捕获value1(或取决于语言为1美元),\ 2中为value2,\中为value3 3。

我有缺陷的正则表达式是:

/[?&](?:key1)=((?:[^+&]+[+&$])+)/

产生0结果。

我使用ECMA语法在c ++中编写这个,但我想我可以将任何正则表达式的解决方案或建议转换为ECMA。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

之前已经回答过,并且为它编写了紧凑的脚本。

正则表达式不是提取查询字符串值的最佳选择。在这个答案的最后,我将给你一个表达式,它可以将给定字段的值提取到单独的引用中。但并不是说使用正则表达式一次一个地提取参数需要“很多”时间,但是它们都可以非常快速地完全提取,而不需要正则表达式引擎。例如,http://www.htmlgoodies.com/beyond/javascript/article.php/3755006/How-to-Use-a-JavaScript-Query-String-Parser.htm

您尝试使用哪种语言来提取这些参数,C ++?

如果您使用的是JavaScript,则使用上面文章中提到的小函数,即

function ptq(q)
{
/* parse the query */
var x = q.replace(/;/g, '&').split('&'), i, name, t;
/* q changes from string version of query to object */
for (q={}, i=0; i<x.length; i++)
{
t = x[i].split('=', 2);
name = unescape(t[0]);
if (!q[name])
q[name] = [];
if (t.length > 1)
{
q[name][q[name].length] = unescape(t[1]);
}
/* next two lines are nonstandard, allowing programmer-friendly Boolean parameters */
else
q[name][q[name].length] = true;
}
return q;
}
function param() {
return ptq(location.search.substring(1).replace(/+/g, ' '));
}

在您的网页脚本中包含该代码后,您可以通过query = param();然后使用query.key1等的值来解析当前网址数据。

您可以直接使用ptq()函数解析其他查询字符串格式的数据,即query_object = ptq(query_string)

如果您正在使用其他语言并且正常表达式是您想要的方式,那么这将返回与key1匹配的所有值,例如:

/key1=([^&;]*)/g

这将返回具有特定字段名称的所有值(在查询字符串定义中,这些值都是这样写的,key1=value1&key1=value2&key1=value3等)。

您提出问题的方式让您觉得自己想要创建自己的程序员友好的提供价值的方式(即,通过构建您自己的自定义网址,而不是通过浏览器从表单提交中接收数据),其中您的值是用空格分隔(空格在HTTP GET查询字符串中编码为+符号,在通用查询字符串中编码为%20)。

您可以制作一个复杂的正则表达式,只需一步即可完成此操作,但匹配整个字段(所有值和+符号)的速度更快,然后将结果拆分为+符号。

对于我指出的正则表达式的每个结果,您只需执行/[^+]*/g

即可提取加号分隔值