2016-12-19 8 views
0

PHPのgloblimited-range of regex-like syntaxをサポートしているようです。globとほぼ正規表現

私はhello<somethingherebutonlyifitbeginsby#>.txtをキャッチしたいと思い、すなわち:

  • hello.txt:OK
  • ハロー#のyou.txt:OK
  • hellome.txt:OKではない

I試しました

glob('hello#?*.txt', GLOB_BRACE); 

しかし、動作しません。どうすれば修正できますか?

+0

'glob'は正規表現をサポートしていません。標準のコマンドラインワイルドカードをサポートしています。たとえば、 '。*'は任意の数の文字(正規表現)を意味するものではなく、リテラルドットの後に何かが続くことを意味します。 –

+0

これは 'glob'では不可能なのでしょうか? – Basj

+1

'hello * .txt'を参照して、望まないものをフィルタリングする方が簡単です。これは、hello.txtとhello#*。txtの2つのグロブです。以前よりパフォーマンスが高い。私は 'hello#*。txt'の検索を推測し、' hello.txt'が存在するかどうかを調べるだけですばやく別のオプションになります。 –

答えて

2

あなたはそのようにそれを書くことができます:

{aa,bb}が交代( GLOB_BRACEと、それを支えるのOSで利用可能な機能)である
glob('hello{#*,}.txt', GLOB_BRACE); 

+1

素敵!既に[ここにコミットしました](https://github.com/josephernest/bloggggg/commit/727c1d807b682b4c37e10a574056319d712a48f2)については、https://github.com/josephernest/blogggggをご覧ください。 – Basj

0

globの正規表現は、[]と[^]の構文を使用して、文字クラスと負の文字クラスもサポートしています。 []内の任意の1文字と一致するか、[^]内にない任意の1文字に一致します。

hello.txt: ok 
hello#you.txt: ok 
hellome.txt: not ok 
//[] include chars. and # 
var_dump(glob('hello[.#]*txt', GLOB_BRACE)); 

array(2) { 
[0]=> 
string(13) "hello#you.txt" 
[1]=> 
string(9) "hello.txt" 
} 


>ls hello* 
hellome.txt hello.txt hello#you.txt