【问题标题】:how to extract parameter(specified pattern string) from string in javascript如何从javascript中的字符串中提取参数(指定的模式字符串)
【发布时间】:2015-06-24 08:15:50
【问题描述】:

我需要从 url 路径中提取参数名称。 参数在 {} 内或跟随第一个?(问号)或跟随 & 网址中的标记。

需要提取的url路径是这样的格式:

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

因此参数为pa,pb,p1,p1,p3

【问题讨论】:

  • 我不认为你可以通过一次匹配获得所有参数
  • @oliveromahony OP 想要的不仅仅是 URL 参数,但绝对可以成为解决方案的一部分。
  • 哦,对不起 - 没有完整阅读!
  • 我考虑了建议的 RFC6570 风格的 URI 解析器,但是你不能混合有和没有具体值的变量(即它们可以解析示例中的路径参数,但它们不能解析查询字符串变量原样)

标签: javascript regex


【解决方案1】:

我能想到的最快的方法是:

[{?&][^}=]+

Debuggex Demo

现在我还要捕获它前面的 {?& 字符,所以你必须在之后将其切断:

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

var found = inp.match(/[{?&][^}=]+/g).map(function(p){ return p.substring(1); });

document.write(found.join('<br />'));

如果您期望 /tt/{pa=}/{pb}/?p1={9888&amp;p2=9&amp;p3=98 之类的东西,其中 pa= 是一个有效的参数名称和/或 {9888 是一个有效值,那么您就有麻烦了。但我怀疑这是一个严重的限制。

【讨论】:

    【解决方案2】:

    从路径中分别提取搜索变量和变量的简单示例:

    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;
    }
    

    使用示例:

    // Object {a: "10", b: "20"}
    extractSearch('?a=10&b=20');
    
    // Object {pa: "1", pb: "2"}
    extractFromPath('/tt/{pa}/{pb}', '/tt/1/2/?p1=9888&p2=9&p3=98');
    

    最终你可以通过以下方式组合它:

    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');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-17
      • 2011-10-25
      • 1970-01-01
      • 2011-10-08
      • 2019-10-30
      • 1970-01-01
      相关资源
      最近更新 更多