Javascript 正则表达式是否正确反对我正在尝试做的事情?
我正在创建一个可重用的node.jsNavigationController类,以便在其他服务器端项目中重用它(如果需要或者其他人可能会发现它很有用) 下面是用例Javascript 正则表达式是否正确反对我正在尝试做的事情?,javascript,regex,node.js,webserver,Javascript,Regex,Node.js,Webserver,我正在创建一个可重用的node.jsNavigationController类,以便在其他服务器端项目中重用它(如果需要或者其他人可能会发现它很有用) 下面是用例 var navController = new NavigationController({ routes : { '/user/:action/:anything' : 'UserController', '/app/:action' : 'AppController', '/
var navController = new NavigationController({
routes : {
'/user/:action/:anything' : 'UserController',
'/app/:action' : 'AppController',
'/file/:action' : 'FileController',
'/feedback/:action' : 'FeedbackController',
'/:anything' : 'ErrorController'
},
ErrorController : 'ErrorController'
});
navController.init();
服务器请求时,用户可以调用该对象的此函数
navController.navigate(req, res);
现在这个和控制器被正确地调用。导航(req,res)函数下的内容是基于URL调用适当控制器对象的一部分,它被定义为名为getRouteByPath(path)的函数。此私有函数将获取路由,并允许导航(req,res)函数获取要调用的控制器类名
var getRouteByPath = function(path) {
for(var route in config.routes) {
var routeRegex = '';
var routeParts = route.split('/');
for(var rp = 0; rp < routeParts.length; rp++) {
// checking if route part starts with :
if(routeParts[rp].indexOf(':') === 0) {
// this is "anything" part
routeRegex += '[/]?([A-Za-z0-9]*)';
} else if(routeParts[rp] != "") {
routeRegex += '[/]?' + routeParts[rp];
}
}
var routeRegexResult = path.match(routeRegex);
if(routeRegexResult) {
console.log(routeRegexResult);
return route;
}
}
return null;
};
var getRouteByPath=函数(路径){
for(config.routes中的变量路由){
var routeRegex='';
var routeParts=route.split('/');
对于(var rp=0;rp
我太担心这个函数了,好像这是正确的方法一样?一些缺陷:
- 为什么将斜杠用作字符类(
)?不需要这样做,只需要在正则表达式文本中使用反斜杠(如[/]
)对其进行转义。只需使用一个“/\//g
”(/
)newregexp(“/”,“g”)
确实有效,但搜索整个字符串并不是很有效。更好地使用,在您的情况下.indexOf()==0
routePart.charAt(0)=“:”
-我建议构建一个新的和使用,因为您不想匹配-我认为也没有必要构建捕获组,因为您只返回路由字符串,而不返回匹配项(好的,您可以记录它们).match()
- 是否要检查整个
是否与您的regexp匹配?别忘了添加路径
和^
。AppController的当前正则表达式也与路径匹配,如$
/user/app/example
- 为什么斜杠(只有斜杠)是可选的(
)?不仅我不认为这是您想要的,而且它还为构建正则表达式打开了大门,比如/?
要避免这种情况,您需要将整个组设置为可选:/\/?user\/?([A-Za-z0-9]*)\/?([A-Za-z0-9]*)/
(?:/([^/]*)?
- 此外,您应该只构建一次正则表达式(初始化时),并将它们存储在缓存中,而不是每次调用
时都构建它们。getRouteByPath
的编译隐藏在代码中的某个地方,尽管它需要进行编译RegExp
routeRegex += '[/]?([A-Za-z0-9]*)';
表示路线可能存在,也可能不存在。/
将匹配。+
可能比*
更合适
另外,由于我瘦\uuuz
是允许在web路由中使用的
您的
.split('/')
将从路由中删除所有/
,因此它不应位于此问题所属的拆分列表中。根据在适当站点发布问题的定义,StackOverflow应该只包含与溢出堆栈相关的问题:)不要在此处使用exec
,使用RegExp.prototype.test
。另外,routePart.indexOf(':')==0
最好写为routePart.charAt(0)=':'
。谢谢,这正是我的意思:-)还要添加indexOf东西[/])?这是因为如果定义的路由类似于/user/:action/:anywhere,并且用户请求URL/user/me或/uer/me/you,那么控制器将在两个请求中都被调用。这不是正常的做法吗?你能解释一下这一点吗?“为什么要将斜杠(/)用作字符类?不需要这样做,只有在正则表达式文本中,才需要用反斜杠对其进行转义。”每次使用字符串调用match
,都会创建一个字符类,尽管这是一个相对庞大的计算,但代码中不会注意到“编译”。另请参见我的最后一点[/]?这是因为如果定义的路由类似于/user/:action/:anywhere,并且用户请求URL/user/me或/uer/me/you,那么控制器将在两个请求中都被调用。这不是正常的做法吗?对,我的大脑屏蔽了你将它们全部附加在一起的事实,还有[/]?
说它可能存在,也可能不存在,我们不总是希望它存在吗?