在Node.js中从一个绝对路径中减去另一个绝对路径

9

我有两条 Node.js 的路径,例如:

var pathOne = '/var/www/example.com/scripts';
var pathTwo = '/var/www/example.com/scripts/foo/foo.js';

如何从一个路径中减去另一个路径,以获得相对路径?

subtractPath(pathTwo, pathOne); // => 'foo/foo.js'

是否有一个模块可以根据所有必要的URL规则来执行此操作,还是我最好使用一些简单的字符串操作?


使用 substring 函数,例如:var sub = pathTwo.substring(pathOne.length, pathTwo.length); - Mohammad Rahchamani
我认为 pathTwo.replace(pathOne,'') 足够了。 - Darth
如果其中一个路径格式不正确怎么办?它将产生错误的结果,例如:'/var/www/example.com/scri' 将给我们 pts/foo/foo.js,这显然是错误的。 - Slava Fomin II
2个回答

25

我不确定你所说的“按照所有必要的URL规则”,但似乎你只需要使用path.relative函数即可;

> var pathOne = '/var/www/example.com/scripts';
> var pathTwo = '/var/www/example.com/scripts/foo/foo.js';

> path.relative(pathOne, pathTwo)
'foo/foo.js'

> path.relative(pathTwo, pathOne)
'../..'

谢谢Joachim!我真傻,竟然没有首先查看path API。看来我不应该太依赖Google =) - Slava Fomin II

0

你可以轻松地使用正则表达式来实现:

var pathOne = /^\/your\/path\//
var pathTwo = '/your/path/appendix'.replace(pathOne, '');

这样你就可以强制它位于第二个路径的开头(使用^),如果它不是完全匹配,它也不会被删除。

你的例子将会是:

var pathOne = /^\/var\/www\/example.com\/scripts\//;
var pathTwo = '/var/www/example.com/scripts/foo/foo.js'.replace(pathOne, '');

它应该返回:foo/foo.js

这并不是很有用。假定路径将来自某个变量输入,而不是硬编码的字符串; 在这种情况下,你如何将其转换为正则表达式?(虽然可以做到,但需要考虑边缘情况。) - David Knipe
顺便说一下,类似于 new Regex('^'+p.replace('/','\/')) 这样的东西。只要它被读取一次且被多次使用,这个解决方案是有效的。从我的角度来看,引入整个外部库以替换一行命令远非好主意。 - skypjack
更像是 new RegExp('^'+ p.replace(/([\[\]\(\)\{\}\.\\\/\?\*\+\|\^\$])/)','\\ $1')。 假设我没有漏掉任何内容。 然后你还要担心 / foo / bar/ foo / baz 这样的情况,并且可能根据是否有尾随斜杠而有所不同。 此外, path 不是一个外部库,它是 nodejs 的一部分。 - David Knipe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接