Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中从字符串中提取参数(指定的模式字符串)_Javascript_Regex - Fatal编程技术网

如何在javascript中从字符串中提取参数(指定的模式字符串)

如何在javascript中从字符串中提取参数(指定的模式字符串),javascript,regex,Javascript,Regex,我需要从url路径中提取参数名。 参数位于{}内,或者在url中的第一个?(问号)后面,或者在&mark后面 需要提取的url路径的格式如下: /tt/{pa}/{pb}/?p1=9888&p2=9&p3=98 因此,参数是pa,pb,p1,p1,p3我能想到的最快方法是: [{?&][^}=]+ 现在我还捕获了前面的{或?或&字符,因此您必须在之后将其切断: var-inp='/tt/{pa}/{pb}/?p1=9888&p2=9&p3=98' var fou

我需要从url路径中提取参数名。 参数位于{}内,或者在url中的第一个?(问号)后面,或者在&mark后面

需要提取的url路径的格式如下:

/tt/{pa}/{pb}/?p1=9888&p2=9&p3=98

因此,参数是
pa
pb
p1
p1
p3
我能想到的最快方法是:

[{?&][^}=]+

现在我还捕获了前面的
{
&
字符,因此您必须在之后将其切断:

var-inp='/tt/{pa}/{pb}/?p1=9888&p2=9&p3=98'
var found=inp.match(/[{?&][^}=]+/g.map(函数(p){返回p.substring(1);});

document.write(find.join(“
”);
从路径中分别提取搜索变量和变量的简单示例:

function extractSearch(search) {
    var result = {};

    search = search || window.location.search;

    if (search.length) {
        search = search.substr(1).split('&');

        for (var i = 0; i < search.length; i++) {
            search[i] = search[i].split('=');
            result[decodeURIComponent(search[i][0])] = decodeURIComponent(search[i][1]);
        }
    }

    return result;
}

function extractFromPath(pattern, url) {
    var keys = [],
        result = {},
        i;

    url = url || window.location.pathname;

    pattern = pattern.replace(/{([^}]+)}/g, function($0, $1) {
        keys.push($1);
        return '([^/]+)';
    });

    pattern = url.match(new RegExp('^' + pattern));

    for (i = 0; i < keys.length; i++) {
        result[keys[i]] = pattern[i + 1];
    }

    return result;
}
最终,您可以通过以下方式进行组合:

function getParameters(pattern, path) {
    var result,
        tmp;

    path = path.split('?');

    result = extractFromPath(pattern, path[0]);

    if (path[1] !== void 0) {
        tmp = extractSearch('?' + path[1]);

        for (var param in tmp) {
            result[param] = tmp[param];
        }
    }

    return result;
}

// Object {pa: "1", pb: "2", a: "10", b: "20"}
getParameters('/tt/{pa}/{pb}', '/tt/1/2?a=10&b=20');

我不认为你能用一个匹配的@oliveromahony OP的一个可能的副本获得所有的参数,你想要的不仅仅是URL参数,但这肯定是解决方案的一部分。哦,是的,对不起,我没有完全阅读它!我考虑过建议的RFC6570风格的URI解析器,但是你不能混合变量和没有具体的值(即,他们可以解析示例中的路径参数,但不能按原样解析查询字符串变量)
function getParameters(pattern, path) {
    var result,
        tmp;

    path = path.split('?');

    result = extractFromPath(pattern, path[0]);

    if (path[1] !== void 0) {
        tmp = extractSearch('?' + path[1]);

        for (var param in tmp) {
            result[param] = tmp[param];
        }
    }

    return result;
}

// Object {pa: "1", pb: "2", a: "10", b: "20"}
getParameters('/tt/{pa}/{pb}', '/tt/1/2?a=10&b=20');