0

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

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

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

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

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

产生 0 个结果。

我正在使用 ECMA 语法在 c++ 中编写此代码,但我认为我可以将解决方案或建议从任何正则表达式风格转换为 ECMA。任何帮助,将不胜感激。

4

1 回答 1

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等来解析当前的 URL 数据。

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

如果您使用另一种语言并且正则表达式是您想要的方式,那么这将返回所有匹配的值key1,例如:

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

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

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

您可以制作一个复杂的正则表达式来一步完成,但匹配整个字段(所有值和 + 符号也是如此)会更快,然后在 + 符号处拆分结果。

对于我指出的正则表达式的每个结果,您可以通过简单地提取加号分隔值/[^+]*/g

于 2013-06-06T23:50:05.030 回答