我有一个查询字符串 www.example.com/yy?q=how+can+i+get+this&o=1&source=home
如何使用 javascript 或 jquery 解析出仅包含 q
参数值的数组?
我想要得到以下数组:
['how', 'can', 'i', 'get', 'this']
我有一个查询字符串 www.example.com/yy?q=how+can+i+get+this&o=1&source=home
如何使用 javascript 或 jquery 解析出仅包含 q
参数值的数组?
我想要得到以下数组:
['how', 'can', 'i', 'get', 'this']
// substring(1) to skip the '?' character
var queryStrings = window.location.search.substring(1).split('&');
var qArray;
for (var i = 0; i < queryStrings.length; i++) {
if (queryStrings[i].substring(0, 2) === 'q=') {
qArray = queryStrings[i].substring(2).split('+');
break;
}
}
q
参数并将其拆分为多个单词,但这忽略了您首先需要解析URL的事实。location.search
即可。function parseUrl(url) {
var a = document.createElement('a');
a.href = url;
return {
href: a.href,
protocol: a.protocol,
host: a.host,
hostname: a.hostname,
port: a.port,
pathname: a.pathname,
search: a.search,
hash: a.hash
};
}
www.example.com/yy?q=how+can+i+get+this&o=1&source=home
)格式不正确,缺少协议,这意味着解析它将会导致pathname
被视为相对路径。要修复此问题,请在URL前加上http://
。var parts = parseUrl('http://www.example.com/yy?q=how+can+i+get+this&o=1&source=home');
var search = parts.search;
function parseUrl(url) {
var a = document.createElement('a');
a.href = url;
return {
href: a.href,
protocol: a.protocol,
host: a.host,
hostname: a.hostname,
port: a.port,
pathname: a.pathname,
search: a.search,
hash: a.hash
};
}
var parts = parseUrl('http://www.example.com/yy?q=how+can+i+get+this&o=1&source=home');
console.log(parts);
这部分很容易搞砸,因为查询字符串很难处理(完全透明,我写了那篇博客)。
任何试图使用正则表达式解析查询字符串的人可能在很多方面都是错误的。
我的建议是不要重复造轮子。我写了一个QueryString解析器,它带有MIT许可证,或者如果您不放心我尝试的解决方案,请考虑使用node的querystring
模块,该模块可与browserify一起使用。
var qs = new QueryString({
flatten: true,
semicolons: false
});
console.log(qs.parse('?q=how+can+i+get+this&o=1&source=home'));
<script src="https://cdn.rawgit.com/zzzzBov/QueryStringJS/master/dist/querystring.min.js"></script>
这一部分看起来很简单。可以告诉您使用以下代码:
'how can i get this'.split(' ');
' foo bar '
会有3个空字符串)。如果不知道您的意图,很难推荐一种行动方案。通常,使用类似于/\s+/g
的正则表达式进行拆分,然后过滤任何可能的前导和尾随空字符串是一种更具弹性的解决方案:
var arr = 'how can i get this'.split(/\s+/g).filter(function (v) {
return v;
});
var parts,
qs,
queryString,
arr;
function parseUrl(url) {
var a = document.createElement('a');
a.href = url;
return {
href: a.href,
protocol: a.protocol,
host: a.host,
hostname: a.hostname,
port: a.port,
pathname: a.pathname,
search: a.search,
hash: a.hash
};
}
parts = parseUrl('http://www.example.com/yy?q=how+can+i+get+this&o=1&source=home');
console.log('parts', parts);
qs = new QueryString({
flatten: true,
semicolons: false
});
queryString = qs.parse(parts.search);
console.log('query string', queryString);
arr =
(queryString.q || '')
.split(/\s+/g)
.filter(function (v) {
return v;
});
console.log('array', arr);
<script src="https://cdn.rawgit.com/zzzzBov/QueryStringJS/master/dist/querystring.min.js"></script>
UrlSearchParams
有部分浏览器支持,但即使如此,在解析查询字符串方面仍然存在问题。{ "message": "Uncaught TypeError: Cannot read property 'split' of undefined", "filename": "http://stacksnippets.net/js", "lineno": 46, "colno": 5 }
- guest271314.search
引起的?当尝试此问题中的示例URL时,结果为空字符串。https://jsfiddle.net/hokqjgpj/ - guest271314q=foo%20bar#baz
在我的例子中应该放在哪里。除非以?
为前缀,否则它不是查询字符串,而是相对路径。如果你只想解析'q=foo%20bar#baz'
,那么你可以使用qs.parse('q=foo%20bar#baz')
,你会看到它返回了正确的结果。 - zzzzBovq=foo%20bar#baz
应该放在哪里。”并不是说你的例子或观点被误解了。从这个角度来看,你的例子超出了实际原始问题的范围。也许你认为问题比它包含的文本更广泛,或者问题的答案应该处理包括编码短语在内的每个可能的查询字符串。实际原始问题并没有提出这个问题。我对你的回答没有意见。鉴于实际原始问题,"downvote"你自己的回答是不必要的。 - guest271314尝试在输入字符串 str
上利用 String.prototype.match()
,带有 RegExp
参数 / q = \ w +。* /
来匹配以“q =”
开头的字符串;使用从 .match()
返回的数组中索引为 0
的字符串项调用 .split()
,带有 RegExp
参数 / q = |&amp;。* | \ + |#|%20 /
;使用 .filter()
从 .split()
返回的数组中删除空项
var res = str.match(/q=\w+.*/)[0].split(/q=|&.*|\+|#|%20/).filter(Boolean);
var str = "www.example.com/yy?q=how+can+i+get+this&o=1&source=home";
var res = str.match(/q=\w+.*/)[0].split(/q=|&.*|\+/).filter(Boolean);
document.write(JSON.stringify(res));
'q=foo%20bar#baz'.match(/q=\w+.*/)[0].split(/q=|&.*|\+/).filter(Boolean)
的输出结果是 ['foo%20bar#baz']
而不是 ['foo', 'bar']
。但请注意,我对你的解决方案没有进一步的兴趣。我已经提供了一个全面的答案,你可以参考它来理解需要解决的所有细节。 - zzzzBov
['q=how', 'can', 'i', 'get', 'this']
。 - Hayivar qArray = q[0].replace('q=','').split('+');
替换了最后一行代码,它成功运行了。 - Hayifor (var i in queryStrings) { if( queryStrings[i].substring(0, 2) === 'q=' ){ array = queryStrings[i].replace('q=','').split('+'); break; } }
- Hayi%20
而不是+
,或者 URL 中包含任何百分号编码的字符,这个解决方案将失败。 - zzzzBov