检查url正则表达式的一部分

时间:2013-03-17 19:40:33

标签: javascript regex

我在导航树中有节点。我想选择属于url的所有节点,以便我可以突出显示它们。我有它工作,但忘了一个边缘情况,其中url的最后一部分以相同的字符串开头。

在这种情况下,如果有人在网址/products/foobar-super,我希望它选择/products/products/foobar-super,而不是/products/foobar

describe('part of url', function () {

  it('matches /products and /products/foobar-super', function () {

    var current = '/producten/foobar-super';

    var nodes = [
      '/products',
      '/products/foobar',
      '/products/foobar-super',
    ];

    var result = [];

    nodes.forEach(function (node) {
      if (new RegExp(node + '.*').test(current)) {
        result.push(node);
      }
    });

    result.should.eql([
      '/products',
      '/products/foobar-super',
    ]);

  });

});

Jsfiddle测试:http://jsfiddle.net/RKDga/2/

不确定是否可以使用正则表达式,我想其他解决方案是拆分节点和/上的当前网址进行比较。

3 个答案:

答案 0 :(得分:1)

以下代码可以帮助您JSFIDDLE

    /*globals mocha: true, describe: true, it: true, beforeEach:true */
(function() {
    function assert(expr, msg) {
        if (!expr) throw new Error(msg || 'failed');
    }

    mocha.setup({
        ui: "bdd",
        ignoreLeaks: true
    });

    describe('part of url', function () {

      it('matches /products and /products/foobar-super', function () {

        var current = '/products/foobar-super';

        var nodes = [
          '/products',
          '/products/foobar',
          '/products/foobar-super',
        ];

        var result = [];
         ;
    var urllist =  current.split("/");
   var temp; 
    nodes.forEach(function (node) {
       temp = "";
      for(var i=1;i<urllist.length; i++){
            temp += "/"+ urllist[i];
          if(node == temp){
             result.push(node );
          }
      }
    });

 console.log(result);          

        assert(result[0] === '/products', 'first item should be /products');
        assert(result[1] === '/products/foobar-super', 'second item should be /products/foobar-super');


      });

    });


mocha.run();
}());

答案 1 :(得分:1)

这是另一种没有正则表达式的解决方案:

describe('part of url', function () {

  it('matches /products and /products/foobar-super', function () {

    var current = '/products/foobar-super';

    var nodes = [
      '/products',
      '/products/foobar',
      '/products/foobar-super',
    ];

    var result = [];

    nodes.forEach(function (node) {

      var node_parts = node.split('/');
      var current_parts = current.split('/');
      var match = true;

      node_parts.forEach(function (node_part, i) {

        if (node_part !== current_parts[i]) {
          match = false;
        }

      });

      if (match) {
        result.push(node);
      }

    });

    result.should.eql([
      '/products',
      '/products/foobar-super',
    ]);

  });

});

答案 2 :(得分:1)

如果

,测试将通过
new RegExp(node + '.*')

更改为

new RegExp(node + '(/|$)')

除非node后跟/或字符串结尾,否则会阻止匹配。