2016-05-06 159 views
0

我正在創建一個非常簡單的文件瀏覽器,並試圖限制路徑爲/local/ANYTHING,但不是/local它是自己的。 (其中任何可以是任何子文件夾)。php設置使用preg_match的路徑?

目前我使用:

$path = (strpos($path, '/local/') !== false) ? $path : "/local/ud"; 

但這接受/local/作爲路徑。目標是如果它不是/local/ANYTHING然後將其設置爲/local/ud

我試過使用preg_match()並將它設置爲/local/*但是這又允許訪問/local

有什麼辦法可以說路徑只能是/local/ANYTHING,而排除/local itself

+0

你可以試試'\ /本地\ /.+'https://www.regex101.com/r/eI7eS9/3 – Alex

+1

甚至更好:'/ local /?+' –

回答

2

這迫使至少一個後信/

preg_match("/\/local\/\w.*/", $input, $output); 

http://www.phpliveregex.com/p/fB2

編輯追加\ W,以確保您不能是在/local/ < - 那裏應該是一個空間後/

也許這更好? "/\/local\/[\w|\d].*/" 單個字母或數字然後任何東西

+0

太好了,似乎工作。感謝您的鏈接,這將派上用場。 – Tom

+0

@Tom歡迎您看到我的字母或數字編輯嗎? – Andreas

1

使用正則表達式應該適合你。 這裏是它的一個味道:

<?php 
     $path = preg_match("&(\/local\/)(.+)&", $path)? $path : "/local/ud"; 
0

您需要定義符包圍你的正則表達式模式。由於您的路徑字符串中存在斜槓,因此可以使用另一個默認的分隔符/~*是一個量詞,而不是通配符。它匹配0個或更多的前一個字符。點是與任何字符匹配的特殊符號。括號定義了一組字符。一個領先的^反轉該組,即「不」:[^abc]意味着任何字符,但a,b,c。

由於現今很多文件系統中的文件名可以包含幾乎任何字符,我們採取的條件是:「本地後只有一個斜線,接受任意數量的連續字符」。

"~/local/[^/].*~u" 

修飾符u在結束分隔符後使得模式UTF-8兼容。

1

爲什麼是正則表達式?有路徑/目錄工具:

if(dirname($path) == '/local' && basename($path) != 'local'){ 
    // path is good 
} 

或者:

$path = (dirname($path) == '/local' && basename($path) != 'local') ? $path : '/local/ud';