将字符串与多种模式之一匹配并提取数据

时间:2019-01-31 18:42:13

标签: javascript regex url url-routing

我想用RegEx或其他任何方法(如果有更好的方法)解决一个问题。我已经尝试了几种方法来实现这一目标,但没有任何效果。

我有一个带有端点的数组:

const endpoints = [
    {
        id: 1,
        url: "/api/items/:itemId"
    },
    {
        id: 2,
        url: "/api/users/:userName/delete"
    },
    {
        id: 3,
        url: "/api/users/:userName/edit"
    }
];

和请求网址:

const url = "/api/users/max/edit";

现在我想要的是一个具有如下功能的功能:

const rewrite = (url, endpoints) => {

    // What is the best way to achieve the following return value:

    return {
        endpointId: 3,
        values: {
            userName: "max"
        }
    };
};

说明:函数应为URL找到合适的端点。端点URL中以冒号开头的所有部分都不是静态的,而应替换为请求URL中的值。在这种情况下,:userName应该替换为max

我从事Web开发已有一段时间了,但老实说,我几乎不知道如何解决此类问题。

2 个答案:

答案 0 :(得分:2)

const rewrite = (url, endpoints) => {
    var doubledArray = Array.prototype.map.call(endpoints, function(el) {
        return {
            id: el.id,
            url: el.url.split('/')
        };
    });

    var parts = url.split('/');
    var i = 0;
    parts.forEach(function(element) {
        doubledArray = doubledArray.filter(el => (element == el.url[i] || el.url[i].startsWith(':')));
        i++;
    });

    return {
        endpointId: doubledArray[0].id,
        values: {
            [`${doubledArray[0].url.filter(el => el.startsWith(':'))[0].substring(1)}`]: parts[doubledArray[0].url.findIndex(function (el) { return el.startsWith(':'); } )],
        }
    };

};

答案 1 :(得分:1)

您可以遍历endpoints,将每个.url放入RegExp来测试该网址。

找到匹配的对象时,只需提取所需的部分并组成具有属性名称的对象即可。

<script>
    const myEndpoints = [
        {
            id: 1,
            url: "/api/items/:itemId"
        },
        {
            id: 2,
            url: "/api/users/:userName/delete"
        },
        {
            id: 3,
            url: "/api/users/:userName/edit"
        }
    ];

    const myUrl = "/api/users/nermal/edit";

    const rewrite = (url, endpoints) => {

        for (let i = 0; i < endpoints.length; i++) {
            var rep = new RegExp(":(\\w+)", "m");
            var propName = rep.exec(endpoints[i].url);

            var reu = new RegExp(endpoints[i].url.replace(propName[0], "(.*)"));
            var a = reu.exec(url);

            if (a !== null) {
                var x = new Object;
                x["endpointId"] = endpoints[i].id;
                var y = new Object;
                y[propName[1]] = a[1];
                x["values"] = y;
                return x;
            }

        }

        return null;
    };

    var q = rewrite(myUrl, myEndpoints);
    console.log(q);
    console.log(q.values);

</script>

输出:

  

对象{的EndpointId:3,值:{...}}
  对象{userName:“ nermal”}