我正在开发一个节点应用程序,我需要一个正则表达式来匹配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.
答案 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-Touch-Screen-Refurbished-Laptop/product_8000
上通过和平解释:
^
:从头开始\/
:匹配/
[^\/]+
:匹配所有内容,直至/
(HP-ENVY-TouchSmart-m7-j010dx-173-Touch-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
}