Perl互換正規表現

Perlの正規表現とほぼ同等の正規表現の利用

PHPでは、Perl(スクリプト言語として良く知られています) の正規表現とほぼ同等の正規表現を利用することができます。 この正規表現を、Perl互換正規表現と呼びます。 Perl独自の拡張があるぶん高機能となっています。 Perl互換正規表現を利用した関数は、関数名が preg_ で始まります。

正規表現を利用した検索

正規表現を利用した検索には、preg_matchを利用します。 引数は、検索パターン、検索対象とする文字列、の順になります。 なお、検索パターンは、「/」で囲むのが慣例になっています。 検索パターンにマッチした場合はtrueを返し、 マッチしなかった場合はfalse を返します。

  $yuubin = "/[0-9]{3}-[0-9]{4}/";
  $address = "650-0033 神戸市中央区江戸町95 井門神戸ビル 1F シティバンク神戸支
店";
  preg_match($yuubin,$address);

もちろん、これだけではありません。 第三の引数(オプション引数)に変数を指定すると、 マッチした文字列が、 パターン全体にマッチした文字列、サブパターンにマッチした文字列、 の順に配列として格納されます。

  $yuubin = "/([0-9]{3})-([0-9]{4})/";
  $address = "650-0033 神戸市中央区江戸町95 井門神戸ビル 1F シティバンク神戸支
店";
  preg_match($yuubin,$address,$result);
  print_r($result);

上のスクリプトを実行した結果は、

Array ( [0] => 650-0033 [1] => 650 [2] => 0033 )

のようになります。配列の先頭はパターン全体になり、 後はサブパターン(検索するパターンで括弧()で括った部分) にマッチした文字列が順に格納されています。

パターンの数を数えるには、preg_match_all を利用します。 引数は、検索パターン、検索対象とする文字列、検索結果の順になります。 この関数は、検索パターンにマッチした個数を返します。

  $yuubin = "/[0-9]{3,4}/";
  $address = "650-0033 神戸市中央区江戸町95 井門神戸ビル 1F シティバンク神戸支
店";
  preg_match_all($yuubin,$address,$result);
  print_r($result);

上のスクリプトを実行した結果は、

Array ( [0] => Array ( [0] => 650 [1] => 0033 ) )

のようになります。 パターンにマッチした文字列が順に格納されています。

Perl互換正規表現は、検索結果の格納方法を選択できます。 通常は上の例のように、パターンにマッチした文字列、サブパターン、となりますが、 preg_matchの第4引数として、 PREG_OFFSET_CAPTUREを選ぶと、マッチした文字列の場所も格納します。 このため、結果は多次元配列になります。

正規表現を利用した置換

正規表現を利用した置換には、preg_replace を利用します。 引数は、検索パターン、置換文字(列)、置換を行う文字列、 置換回数(オプション)の順になります。 この関数は、置換を行った結果を返します。 例えば、下のように利用します。

  $replacedtext = preg_replace("/(<br>)+/","$1",$text);
  print($replacedtext);

この例では、改行(<br>)が複数出てきた場合、 1つだけにします。 $1は(一般には「ドルマーク+数字」)、 正規表現のサブパターン(括弧で括られた部分)を順に参照します。 数字が0ではなく1からはじまることに注意しましょう。

検索パターン、置換文字列には、配列を利用することができます。 検索パターンにマッチした文字列は、 置換文字列の配列の対応する要素に置換されます。 (要素数が異なる場合などで対応する要素が無い場合は、 空に置換されます)

  $eigo = array(Sun,Mon,Tue,Wed,Thu,Fri,Sat);
  $nihongo = array(日,月,火,水,木,金,土);
  $replacedtext = preg_replace($eigo,$nihongo,$text);
  print($replacedtext);
Copyright (C) 2003-2013. PHP で WEB 作成 All rights reserved.