2010-09-07 68 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

相關問題