在javascript中使用数组解析url

时间:2017-10-11 12:52:06

标签: javascript html regex parsing

我有以下格式输入来自GET方法的网址

rec_test.html?emotion=Happy&myInputs_1%5B%5D=things&myInputs_1%5B%5D=are&myInputs_1%5B%5D=working&myInputs_2%5B%5D=i&myInputs_2%5B%5D=hope&myInputs_3%5B%5D=so

我正在尝试使用以下代码解析它:

function getParameterByName(name){
                    var url = window.location.search;
                    name = name.replace(/[\[\]]/g, "\\$&");
                    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)");
                    results = regex.exec(url);
                    if (!results) return null;
                    if (!results[2]) return '';
                    return decodeURIComponent(results[2].replace(/\+/g, " "));
                }

但是当我将myInputs_1传递给函数时,它返回null。

我不知何故计划以以下格式生成输出:

myInput_1 = ['things', 'are', 'working']
myInput_2 = ['i', 'hope']
myInput_3 = ['so']

但我无法提取个别值。有没有办法实现所需的输出?

edit_1

我了解到%5B[%5D],但即使我将myInput_1[]作为参数传递给函数,它仍会返回null ,我不知道为什么

3 个答案:

答案 0 :(得分:2)

您可以使用URLSearchParams实例的URL对象:

s = "http://example.com/rec_test.html?emotion=Happy&myInputs_1%5B%5D=things&myInputs_1%5B%5D=are&myInputs_1%5B%5D=working&myInputs_2%5B%5D=i&myInputs_2%5B%5D=hope&myInputs_3%5B%5D=so"

url = new URL(s)
searchParams = url.searchParams

console.log(searchParams.getAll("myInputs_1[]"))
// ["things", "are", "working"]

答案 1 :(得分:1)

使用.execfind successive matches时,您需要执行while循环。另外,我简化了你的正则表达式。

function getParameterByName(name){
    var url = decodeURIComponent(window.location.search);
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "=([^&#]*)", 'g');
    var match, result = [];
    while ((match = regex.exec(url)) !== null)
        result.push(match[1]);
    return result;
}

除非您的浏览器兼容性对您很重要,否则我建议您使用Jean的答案。

答案 2 :(得分:0)

非正则表达方式

function getParamByName(name){
    var value = []
    paramsArray = decodeURIComponent(window.location.search).split("?")[1].split("&")
    paramsArray.forEach(function(d){
        if(d.indexOf(name) > -1){
            value.push(d.split("=")[1])
        }
    })
    return value;
}