2012-03-08 8 views
1

私はpreg_match($regexp, $filename)を使ってファイルとディレクトリのいくつかの名前を解析しようとしています。具体的には、 "directory/subdirectory/filename.h"のような文字列を指定すると、文字列が "filename.h"で終わるかどうかチェックしたい。PHPの正規表現 - ピリオド '。'の問題character in preg_match

すべてのリテラル(たとえば '/'と '。')をエスケープすると、私のテストは次のようになります:

preg_match('/filename\.h$/', ''directory\/subdirectory\/filename\.h'); 

ただし、上記のコード行はfalseを返します。

奇妙なことに、次のコード行はtrueを返します。正規表現は、正規表現が'/filename\.h$/'ある'/\.h$/'が、偽である場合、これはtrueと評価する理由

preg_match('/\.h$/', 'directory\/subdirectory\/filename\.h'); 

誰でも知っていますか?

答えて

2

テストする文字列で、スラッシュとドットをエスケープしないでください。彼らは、単一引用符で囲まれた文字列内のリテラルのバックスラッシュとして扱われるので、一致していません。

preg_match('/filename\.h$/', 'directory/subdirectory/filename.h'); 
// Matches! 
+0

グレート、この作品!私は本当にあなたの助けに感謝します。 Upvoted。 :) – solvingPuzzles

1

あなたのみ最初の引数(正規表現)をエスケープする必要があります。 2番目の引数はバックスラッシュを文字通り(単一引用符で囲んでいるため)取ります。これにより

念頭に置いて、あなたの最初のpreg_matchは、この比較やっている:

directory\/subdirectory\/filename\.h 
         filename .h 
           ^... This is why it doesn't match 

を2つ目は、これをやっている:

directory\/subdirectory\/filename\.h 
            .h MATCH! 
+0

ありがとう!私は助けに感謝します。 :) – solvingPuzzles