1J.5 正規表現関数(preg系)
| 構文 | 説明 |
|---|---|
mixed preg_match ( string pattern, string string [,array ®s [,int flags [,int offset]]] ) |
文字列 string が正規表現 pattern にマッチした場合 1 を返します。それ以外は 0 を返します。 戻り値はマッチした回数を表します。これは preg_match_all に合わせた仕様です。エラーの場合は FALSE を返します。 配列 regs が指定された場合、regs[0] にはマッチした文字列全体が格納されます。 また、pattern 中に括弧で括られたサブパターンがあった場合は、マッチした順に regs[1] から格納されていきます。 尚、正規表現にマッチしなかった場合、空の配列を返します。 PHP4.3以降では引数としてさらにflagsとoffsetが追加されました。詳細はPHPのマニュアルを参照して下さい。 用例:日付の分解
preg_match(("/(\d+)\/(\d+)/", "6/29", $regs);
# $regs = array(0=>"6/29", 1=>"6", 2=>"29");
用例:単語("php")の検索
$text = "The Php is Great.";
preg_match(("/\bphp\b/i", $text);
# PCREでは\bは単語境界、修飾子iはCase Insensitiveです
用例:URLからドメイン名の取得
$url = "http://www.y2sunlight.com/ground/index.php";
preg_match("/^(http:\/\/)?([^\/]+)/i", $url, $regs);
$host = $regs[2]; # www.y2sunlight.com
|
mixed preg_match_all ( string pattern, string string, array ®s [,int flags [,int offset]] ) |
文字列 string が正規表現 pattern にマッチした回数を返します。エラーの場合は FALSE を返します。 この関数は文字列中の全てのパターンを検索します(グローバルマッチと呼ばれています)。 検索結果は2次元配列 regs に格納されます。正規表現にマッチしなかった場合、空の配列 1 を返します。 筆者の実験(PREG_PATTERN_ORDERの場合)では、初期化された空の2次元が返ってきました。
regs への格納方法は flags で指定します。regs への格納方法を指定する flags には次の2つがあります。
PHP4.3以降では flags に PREG_OFFSET_CAPTURE が加わり引数として offset が追加されています。 詳細はPHPのマニュアルを参照して下さい。 用例:HTMLタグの検索
$text = "<b>bold</b><a href=index.php>link</a>";
preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $text, $regs);
# PCREでは後方参照が使えます。\\2は2番目のサブパターンを表します。
#
# 結果は以下のようになります:
# $regs[0][0]: <b>bold</b> $regs[0][1]: <a href=index.php>link</a>
# $regs[1][0]: <b> $regs[1][1]: <a href=index.php>
# $regs[2][0]: b $regs[2][1]: a
# $regs[3][0]: bold $regs[3][1]: link
# $regs[4][0]: </b> $regs[4][1]: </a>
|
mixed preg_replace ( mixed pattern, mixed replacement, mixed string [,int limit] ) |
文字列 string 中の正規表現 pattern にマッチした部分文字列を、replacement で置換し、置換後の文字列を返します。 正規表現にマッチしなかった場合は、元の string を返します。 limit を指定した場合、 置換回数を limit 回に制限します。 limit が省略されるか -1 の場合は、全て置換されます。
|
mixed preg_replace_callback ( mixed pattern, mixed callback, mixed string [,int limit] ) |
preg_replace_callback() は、置換文字列の代わりに コールバック関数 callback を使います。 その他は preg_replace() と同じです(但し、e修飾子は無視されます)。 callback はマッチしたパターンの配列(preg_match() の regs と同じ)を引数とし、置換文字列を返します。 用例:単語の入れ替え
$str = "sun light";
function word_swap($regs){ return $regs[2].' '.$regs[1]; }
$str = preg_replace_callback("/(\S+)\s+(\S+)/","word_swap",$str);
#匿名関数を使って次のようにも書けます
$str = preg_replace_callback("/(\S+)\s+(\S+)/",
create_function('$regs','return $regs[2]." ".$regs[1];'),
$str);
|
array preg_split ( string pattern, string string [,int limit [,int flags]] ) |
文字列 string をセパレータ pattern (正規表現)により分割した部分文字列から成る配列を返します。 セパレータが1つもマッチしなかった場合は、string を返します。これは string が空の場合でも同じです。 エラーの場合、split() は FALSE を返します。 limit が指定された場合、返される配列には 最大 limit の要素が含まれます。 この場合、最後の要素には string の残りの部分文字列が入っています。 preg_split() はセパレータが空の場合、string を1文字毎に分解します。 reg_split() のこの振る舞いは、Perl の split関数 に似ています。
PHPの split() にはこの振る舞いはありません。
筆者の実験では、 $arr = preg_split("//",$str) の場合、$arr の最初と最後の要素は空文字でした。
用例:
$words = preg_split("//", "hi there",-1,PREG_SPLIT_NO_EMPTY);
echo join(":",$words); # "h:i: :t:h:e:r:e"を表示
flags には次のフラグを指定する事ができます。 複数指定するには論理和(|)を使用します。 尚、以下の他にも flags に指定できるものがあります。 詳細はPHPマニュアルを参照意して下さい。
用例:
$text = "Fred is Great!!";
$words = preg_split("/\W+/", $text);
echo join(":",$words); # "Fred:is:Great:"を表示
$words = preg_split("/(\W+)/", $text,-1,PREG_SPLIT_NO_EMPTY|
PREG_SPLIT_DELIM_CAPTURE);
echo join(":",$words); # "Fred: :is: :Great:!!"を表示
|
array preg_grep ( string pattern, array input ) |
正規表現 pattern にマッチする入力配列 input の要素からなる配列を返します。 返される配列は、入力配列 input のキーを使用して添字が設定されます。 添字を再設定するには array_values() を使用して下 さい。 用例:PHPファイルの一覧
$handle = opendir('.'); # カレントディレクトリ
while ($file=readdir($handle)) $files[] = $file;
closedir($handle);
$phps = preg_grep("/\.php$/",$files); # *.phpのみ抽出
|
string preg_quote ( string str [, string delimiter] ) |
preg_quote() は、正規表現で使われる特殊文字をエスケープ(バックスラッシュの挿入)します。 delimiter を指定すると、ここで指定した文字もエスケープします。 これは、preg系 関数が使用する デリミタ( / )をエスケープする場合に便利です。 正規表現の特殊文字は、次のものです:
この関数は、キーワード検索やファイル名検索などを行う場合に有用です。 用例:キーワード検索
$pattern = "/" . preg_quote($key, '/') . "/";
if (preg_match($pattern, $text)){
//
}
|
preg系関数で良く使うパターン修正子
以下にpreg系関数(PCRE)で良く使うパターン修飾子をPHPマニュアルから引用しておきます。 これ以外にもパターン修飾子はあります。詳しくはPHPのマニュアルを参照して下さい。
| 修飾子 | 意味 |
|---|---|
i |
パターンの中の文字は大文字にも小文字にもマッチします。 |
m |
デフォルトで、PCREは検索対象文字列を(実際には複数行からなる 場合でも)単一の行からなるとして処理します。 「行頭」メタ文字(^) は文字列の最初にしかマッチしません。 一方、「行の終端」メタ文字($) は文字列の終わりまたは(D 修飾子が設定されていない場合、) 終端を表す改行記号の前のみにしかマッチしません。この動作は Perl と同じです。 この修飾子が設定された場合、「行頭」および「行末」は subject文字列において、 文字列の最初と最後と同じに、各改行の直前と直後にそれぞれマッチします。 この動作は、Perl の /m 修飾子と同じです。 subject 文字列の中に "\n" 文字がない場合、またはパターンに ^ または $ がない場合、 この修飾子を設定しても意味はありません。 |
s |
この修飾子が設定された場合、パターン中のドットメタ文字は「改行」を含む全ての文字にマッチします。 これを指定しない場合、改行は除かれます。この修飾子は、Perl の /s 修飾子と等価です。 [^a] のような否定クラスは、この修飾子の設定によらず、常に改行文字にマッチします。 |
e |
この修飾子が設定されている場合、preg_replace() は、置換文字列において後方参照に関する通常の置換を行った後、 PHP コードとして評価し、検索文字列を置換するためにその結果を使用します。 この修飾子を使用するのは、preg_replace()のみです。他の PCRE 関数では無視されます。 |
※Perlでよく使用されるg修飾子はありませんが、同等の機能は関数により提供されています。
