2010-09-07 72 views
4

如何从非根相对路径中删除尾部的斜杠和点。删除点和斜杠正则表达式 - 非相对的

例如,../../../somefile/here/(独立于它有多深),所以我只是得到/somefile/here/

+0

这是没用的问题。无论如何,它不会给你一条真正的道路。是什么让你觉得你需要这样一个替代品?它是用于文件系统路径还是虚拟Web服务器资源? – 2010-09-07 19:08:59

+0

原因然后可以做$ _SERVER ['DOCUMENT_ROOT']。newpath; – Mike 2010-09-07 19:10:38

+0

从哪里得到这些带点的路径?它在您的脚本中被硬编码,现在您想要重写它以与DOCUMENT_ROOT一起使用? – 2010-09-07 19:12:48

回答

7

需要任何的正则表达式,而使用ltrim()/.。就像这样:

echo "/".ltrim("../../../somefile/here/", "/."); 

此输出:

/somefile/here/ 
+0

请注意,前导斜杠很重要 - 它总是指根目录。 – BoltClock 2010-09-07 19:00:43

+0

是的,这就是为什么我特意附加它。用户可以删除它,如果需要,仍然可以成功剥离所有'/'和'.' – shamittomar 2010-09-07 19:05:33

+0

'/ .foo'怎么办? – Gumbo 2010-09-07 19:12:55

2

您可以使用realpath()功能PHP提供。然而,这需要文件存在。

+0

@无论谁低估,请介意说明一下?阅读手册,这是做他想做的,因为文件存在。 – 2010-09-07 19:01:52

+0

而且它会做与..相关的事情。程序员OFTEN miss是某个* nix系统上的“..”,可能会导致符号链接,因此..可能实际上将其移动到磁盘的完全不同的部分。 – 2010-09-07 19:26:37

2

如果我理解正确你:

$path = "/".str_replace("../","","../../../somefile/here/"); 
+0

这会失败**在'/../../../ somefile/here /'上,并且会返回'// somefile/here' – shamittomar 2010-09-07 19:02:19

0

(\.*/)*(?<capturegroup>.*)

第一场小组赛点,随后斜线的无限次数的一些数量;第二组是你感兴趣的人。这会剥去你的主要斜杠,所以请加一个斜线。

请注意,这绝对不能证明您的主要字符串斜杠和句点不是明显愚蠢的。但是,它不会剥离你的路径上的领先点,就像第一组明显的([./])*模式;它发现最长的一串点和斜线以斜线结尾,所以如果它以点开始,它不会伤害到你的真实路径。

请注意明显的“/”。 ltrim()策略将从目录名称中删除前导点,如果您的第一个目录有一个 - 完全合理,那么这是坏的,因为前导点用于隐藏目录。

1

这应该工作:

<?php 
echo "/".preg_replace('/\.\.\/+/',"","../../../somefile/here/") 
?> 

您可以测试它here

1

你可以尝试:

<?php 
$str = '../../../somefile/here/'; 
$str = preg_replace('~(?:\.\./)+~', '/', $str); 
echo $str,"\n"; 
?> 
+0

+1谢谢工作的好 – 2014-08-23 16:03:01

相关问题