gpt4 book ai didi

javascript - 正则表达式对我想做的事情是否正确?

转载 作者:行者123 更新时间:2023-12-02 19:30:32 24 4
gpt4 key购买 nike

我正在创建一个可重用的node.js NavigationController 类,这样我就可以在其他服务器端项目中重用它(如果我可能需要或者其他人可能会发现它有用)。

这是用例。

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);

现在这个和 Controller 被正确调用了。 navigate(req, res) 函数下的内容是基于 URL 调用适当 Controller 对象的一部分,被定义为名为 getRouteByPath(path) 的函数。此私有(private)函数将获取路线,并允许 navigate(req, res) 函数获取要调用的 Controller 类名称。

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;
};

我太担心这个功能了,好像这是正确的方法?

最佳答案

一些缺陷:

  • 为什么使用斜杠作为字符类( [/] )?不需要这样做,只有在正则表达式文字中,您需要使用反斜杠对其进行转义(例如 /\//g )。只需使用单个“/ ”即可( new RegExp("/", "g") )。

  • .indexOf(<string>)==0确实有效,但搜索整个字符串并且效率不高。更好用startswith ,在你的情况下routePart.charAt(0)==":"

  • <string>.match(<string>) - 我建议建立一个新的 RegExp object并使用 .test ,因为您不想匹配 - 我认为也不需要构建捕获组,因为您只返回路由字符串,但没有匹配项(好吧,您记录它们)。

  • 您想要检查是否整个 path与你的正则表达式匹配吗?不要忘记添加^$ 。您当前的 AppController 正则表达式也匹配类似 /user/app/example 的路由。 .

  • 为什么你的斜杠(并且只有斜杠)是可选的( /? )?我不仅认为这不是你想要的,而且它还打开了catastrophic backtracking的大门。当构建像 /\/?user\/?([A-Za-z0-9]*)\/?([A-Za-z0-9]*)/ 这样的正则表达式时

    为了避免这种情况,您需要将整个组设置为可选:(?:/([^/]*))? .

  • 此外,您应该仅构建一次正则表达式(在初始化时)并将它们存储在缓存中,而不是每次调用 getRouteByPath 时构建它们。 。汇编RegExp隐藏在代码中的某处,尽管它需要发生。

关于javascript - 正则表达式对我想做的事情是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11544134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com