2016-05-06 8 views
0

私は非常に単純なファイルブラウザを作成していて、パスを/local/ANYTHINGに制限しようとしていますが、/localではありません。 (ANYTHINGは任意のサブフォルダにすることができます)。preg_matchを使用してPHPパスを設定しましたか?

$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

あなたは/local/ <でもカントを確認するために、\ wを追加するための編集/

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

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

後のこの力少なくとも1つの文字は、 -/

の後にスペースがあるようになっています

おそらくこれはさらに優れていますか? "/\/local\/[\w|\d].*/" 1文字または数字を入力してください。

+0

これはうまくいくようです。リンクをありがとう、それは便利です。 – Tom

+0

@あなたは大歓迎です。手紙や数字で私の編集を見ましたか? – Andreas

1

を使用する正規表現を使用すると効果的です。あなたは区切り文字は、あなたの正規表現パターンを囲む必要

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

: は、ここでの一つの味です。パス文字列にはスラッシュがあるので、デフォルトの/以外の区切り文字も使用できます。 ~*は、ワイルドカードではなく量子です。前の文字が0回以上出現したときに一致します。ドットは、任意の文字にマッチする特別なシンボルです。角カッコは一連の文字を定義します。先頭の^は、セットを逆にします。つまり、「not」です。[^abc]は、a、b、c以外の任意の文字を意味します。

ファイルシステムには現在ほとんどの文字が含まれている可能性があるため、「ローカルの後にスラッシュを1つしか使用できません。

"~/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'; 
関連する問題