文字列の中の特定のパターンを検索する方法として、正規表現というものがあります。以前、.htaccessでディレクトリ内の特定文字列を含むファイルへのアクセスを禁止する方法について書いたエントリの中で少し触れたのですが、今回は書式のおさらいと、PHPでの対応する関数の紹介を行います。
まず正規表現の書式ですが、以前紹介したエスケープ(\または¥)、行頭(^)、行末($)、または(|)の他にもいくつか記号があるので、一覧表にしてみます。
記号 | 意味 | 使用例 | マッチするテキスト |
.(ピリオド) | 任意の一文字(ワイルドカード) | te.t | text,tent,te!t |
*(アスタリスク) | 直前の文字の0回以上の繰り返し | te.*t | text,texxxt,tet |
+(プラス) | 直前の文字の1回以上の繰り返し | te.+t | text,texxxt |
?(クエスチョンマーク) | 直前の文字が0または1回登場 | te.?t | text,tet |
¥(円マーク) | 特殊文字のエスケープ(windows) | te¥.¥?t | te.?t |
\(バックスラッシュ) | 特殊文字のエスケープ(windows以外) | te\.\?t | te.?t |
^(カレット) | 行頭 | ^\.ht | .htaccess,.htpasswd |
$(ドル) | 行末 | nt$ | tent,plant |
[](角括弧) | 括弧内に現れる文字のどれか | te[xyz]t | text,tezt |
-(ハイフン)を使った応用編 | te[a-z]t | tebt,tewt(aからzまで可) | |
-(ハイフン)を使った応用編 | te[1-9]t | te3t,te8t(1から9まで可) | |
^(カレット)は角括弧中で否定の意 | te[^nx]t | test(text,tentはダメ) | |
()(丸括弧) | グルーピング | (te)*xt | xt,text,tetext |
|(パイプライン) | または | ([a-z]|[1-9])* | aaa,a,9999 |
PHPで正規表現によるマッチングを行うには、PCRE関数というPerlでの正規表現に準拠した関数群を使います。preg_という接頭辞がついたこの関数群に正規表現のパターンを与える時は、パターン文字列の前後をスラッシュで囲むという約束事があります。基本的なpreg_match関数で例を見てみましょう。
<?php $teststring = "Hello!"; preg_match("/He[a-z]+/",$teststring); ?> |
引数1にパターン文字列、引数2に検索対象を与えています。引数3、4、5もあるのですが、省略可です。 パターン文字列にマッチしたものがあると、preg_match関数は返り値として1を返します。ちなみに返り値として検索がマッチした回数を返してくれる、preg_match_allという関数もあります。
その他、検索置換機能を備えたpreg_replaceや、配列を精査してくれるpreg_grepという関数もありますので、それらの活用例もいずれエントリでアップできればと思っています。
ピンバック: PHPのPCRE関数を使ってデイレクトリ内の特定拡張子ファイルのリストを取得する | AkisiのWEB制作日記