.Water-Sunlight
.サイトメニュー
.検索
.オンライン状況
登録ユーザ: 0
ゲスト: 6
.
<< Prev
正規表現関数(ereg系)
« INDEX »
PHP 文法編
Next >>
関数
作成日:2006/05/10

1J.5 正規表現関数(preg系)

preg系関数の正規表現については PHPマニュアル を参照。
構文説明
mixed preg_match
( string pattern,
  string string
[,array &regs
[,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  &regs
[,int flags
[,int offset]] )

文字列 string が正規表現 pattern にマッチした回数を返します。エラーの場合は FALSE を返します。 この関数は文字列中の全てのパターンを検索します(グローバルマッチと呼ばれています)。

検索結果は2次元配列 regs に格納されます。正規表現にマッチしなかった場合、空の配列 1 を返します。

筆者の実験(PREG_PATTERN_ORDERの場合)では、初期化された空の2次元が返ってきました。

regs への格納方法は flags で指定します。regs への格納方法を指定する flags には次の2つがあります。

PREG_PATTERN_ORDER (デフォルト):
regs[パターン順][マッチ順] として検索文字列格納します。 regs[i][j] は j 番目にマッチした (i-1) 番目のサブパターンが格納されます。 0 番目のサブパターンとはマッチした文字列全体です。
PREG_SET_ORDER:
regs[マッチ順][パターン順] として検索文字列格納します。 regs[i][j] は i 番目にマッチした (j-1) 番目のサブパターンが格納されます。 0 番目のサブパターンとはマッチした文字列全体です。

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 の場合は、全て置換されます。

後方参照:

replacement の中では後方参照が使えます。 後方参照は、「\\数字」または「$数字」で行います。 PHPマニュアルではPerlと同じ「$数字」形式を推奨しています。 「数字」はマッチしたサブパターンの順番を表し、1 〜 99 までが使えます。 また、\\0または$0はマッチした文字列全体を指定するのに使えます。 後方参照の直ぐ後に数字が続く場合は、「${数字}」と記述します。

用例:単語の入れ替え
$str = "sun light";
$str = preg_replace("/(\S+)\s+(\S+)/","$2 $1",$str);
# PCREでは\sは空白文字、\Sは非空白文字です
配列を使った置換:

pattern と replacementを配列にした場合、各(pattern と replacement)の組に対して順に置換を実行します。 (pattern と replacement)の組は配列要素の順に決まるので、各配列は ksort() でソートしておくのが無難です。

replacement の要素が pattern より少ない場合は、空の文字列('')で置換します。 また、replacement が文字列で pattern が配列の場合は、各 pattern に同じ replacement が使用されます。

string が配列の場合、配列の各要素に対して置換が行われ、配列を返します。

用例:HTMLの特殊文字を実体参照に変換
$lines = preg_replace(array( '/>/' ,'/</' ),
                      array( '>','<'),
                      array( "<b>bold</b>","<i>italic</i>"));
e修飾子:

e修飾子を指定した場合、preg_replace() は replacement に後方参照を適用した後の文字列をPHPコードとして評価し、 検索文字列に対する置換を行います。

用例:HTMLタグの小文字変換
$html = preg_replace("/(<\/?)(\w+)([^>]*>)/e",
                     "'$1'.strtolower('$2').'$3'", $html);
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マニュアルを参照意して下さい。

PREG_SPLIT_NO_EMPTY:
このフラグを指定すると空でない文字列だけを返します。 stringの最初や最後にセパレータがある場合、またはセパレータが連続する場合、preg_split() は空文字列を返します。 このフラグはこの現象を抑止する為に使用します。
PREG_SPLIT_DELIM_CAPTURE:
セパレータ内の全てのサブパターンも同時に返されます。
用例:
$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修飾子はありませんが、同等の機能は関数により提供されています。

<< Prev
正規表現関数(ereg系)
« INDEX »>
Page Top
Next >>
関数

.