我正在尝试在Nodejs中制作路由器。其中很大一部分是URI -> action
,因此我需要一个简单的可配置URI列表,并将它们重新定位到regexp以匹配请求URI。
简单!我用PHP做了一百万次。给予或接受。
所以这就是我做的(测试):
> uri = '/users/#/status/*'
> uri.replace(/\//g, '\\/').replace(/#/g, '(\d+)').replace(/\*/g, '([^/]+)')
我正在做的是1)转义/
和2)用#
替换\d+
并且3)用*
替换[^/]+
< / p>
在Chrome中,这可以按预期工作:
< \/users\/(d+)\/status\/([^/]+)
转义/
并正确替换#
和*
。这是V8。
在Nodejs中:
< \\/users\\/(d+)\\/status\\/([^/]+)
阙!?每个/
都会被双重逃脱?我要么获得双重转义/
,要么转未/
。
正则表达式是对的,对吧?
我正在使用Chrome 15 dev(V8 javascript)和Node 0.5.8 dev(V8 javascript)。这是怎么回事?
潜在的有趣
如果我测试/^\/users\/(\d+)\/status\/([^/]+)/.test('/users/1/status/x')
,则会在Chrome和节点中返回true。
答案 0 :(得分:5)
这是由于Node REPL与Chrome控制台的不同之处。当您在Node中运行命令时,您将看到转义字符串(包括“隐形”转义字符),但是当您在Chrome中看到它时,它是已评估的实际字符串,并删除了转义字符。它们是相同的字符串,但Chrome正试图为你“美化”它。
事实上,如果您将从Node获得的字符串复制并粘贴到Chrome(甚至是FF Firebug)控制台中,您将获得一个包含单个转义符的字符串。如果您再次复制并粘贴它,它将删除下一级转义字符。
Chrome控制台:
> "\\/users\\/(d+)\\/status\\/([^/]+)"
"\/users\/(d+)\/status\/([^/]+)"
> "\/users\/(d+)\/status\/([^/]+)"
"/users/(d+)/status/([^/]+)"