2016-05-06 217 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';