正则表达式匹配nodejs中的url模式

时间:2014-01-22 13:51:11

标签: javascript regex node.js

我正在开发一个节点应用程序,我需要一个正则表达式来匹配url模式并从url中获取信息,建议可能的解决方案。

This are the url patterns:
1) www.mysite.com/Paper/cat_CG10
2) www.mysite.com/White-Copy-Printer-Paper/cat_DP5027
3) www.mysite.com/pen/directory_pen?
4) www.mysite.com/Paper-Mate-Profile-Retractable-Ballpoint-Pens-Bold-Point-Black-Dozen/product_612884
5) www.mysite.com/22222/directory_22222?categoryId=12328

These is what is want from the above url:
1) name= "cat" value="CG10"
2) name= "cat" value="DP5027"
3) name= "directory" value ="pen"
4) name="product" value ="612884"
5) name="directory" value="22222" params = {categoryId : 12328}

I want a regex which can match the url pattern and get the values like name, value and params out of the urls.

3 个答案:

答案 0 :(得分:1)

此功能可以实现您提供的网址和所需匹配的技巧。它还将解析出无限数量的查询参数。

小提琴:http://jsfiddle.net/8a9nK/

function parseUrl(url)
{
    var split = /^.*\/(cat|directory|product)_([^?]*)\??(.*)$/gi.exec(url);
    var final_params = {};
    split[3].split('&').forEach(function(pair){
       var ps = pair.split('=');
       final_params[ps[0]] = ps[1];
    });
    return {
        name: split[1], 
        value: split[2], 
        params: final_params
    };
}

解释

^从字符串的开头开始 .*匹配任意数量的任何内容(我们不关心的网址的开头)
\/匹配一个反斜杠(在我们关心的事情之前的最后一个)
(cat|directory|product)匹配并捕获单词cat OR目录或产品(这是我们的名称
_匹配下划线(分隔名称的字符)
([^?]*)匹配并捕获任意数量的任何内容,除了问号(这是我们的
\??匹配问号(如果存在),否则不要担心(潜在查询字符串的开头)
(.*)匹配并捕获任意数量的任何内容(这是我们稍后将拆分为 param 的整个查询字符串)
$匹配字符串的结尾

答案 1 :(得分:0)

下面的正则表达式将在其匹配组1& 2所需的值

/^\/[^\/]+\/([^_]+)_([^\/_?]+).*$/

在字符串/HP-ENVY-TouchSmart-m7-j010dx-173-Touc‌​h-Screen-Refurbished-Laptop/product_8000上通过和平解释:

  • ^:从头开始
  • \/:匹配/
  • [^\/]+:匹配所有内容,直至/HP-ENVY-TouchSmart-m7-j010dx-173-Touc‌​h-Screen-Refurbished-Laptop
  • \/:匹配/
  • ([^_]+)匹配并捕获_product)之前的值
  • _:匹配_
  • ([^\/_?]+)匹配并捕获_ ?_/8000).*后的值>
  • $匹配到最后 - 如果有什么
  • var re = /^[^\/]+\/[^\/]+\/([^_]+)_([^\/_?]+).*$/; var matches = re.exec('www.mysite.com/22222/directory_22222?categoryId=12328'); console.log(matches.splice(1)); 结束

示例:

["directory", "22222"]

输出:

{{1}}

答案 2 :(得分:0)

使用url模块来帮助您,而不是使用正则表达式完成所有操作:)

var uri = require( 'url' ).parse( 'www.mysite.com/22222/directory_22222?categoryId=12328', true );

产生(与其他东西):

{ 
  query: { categoryId: '12328' },
  pathname: 'www.mysite.com/22222/directory_22222'
}

现在为了得到你的最后一部分:

uri.pathParams = {};
uri.pathname.split('/').pop().split('_').forEach( function( val, ix, all ){
    (ix&1) && ( uri.pathParams[ all[ix-1] ] = val );
} );

产生:

{ 
  query: { categoryId: '12328' },
  pathParams: { directory: '22222 },

  ... a bunch of other stuff you don't seem to care about
}