第5回 正規表現
1.パターンマッチング
PHPでは正規表現を用いて、文字列のパターンマッチングを行うことができます。 その際に用いるのがメタ文字です。 メタ文字を用いた文字列操作の得意な言語にはよくPerlが挙げられますが、PHPでもPerlに近い数のメタ文字を扱うことができます。
2.2つの正規表現
PHPで用いることのできる正規表現には、POSIXで定義されているPOSIX拡張正規表現と、Perlで使われている正規表現の二つがあります。
2-1.POSIX拡張正規表現
もともとUNIXで誕生した正規表現を、共通インターフェイス規格であるPOSIXに則って拡張したものです。 用いることのできる主なメタ文字とその意味を、下に挙げます。
メタ文字 | 意味 |
. | 任意の一文字と一致 |
? | 直前の表現が0〜1回続く |
* | 直前の表現が0回以上続く |
+ | 直前の表現が1回以上続く |
{n,m} | 直前の表現がn回以上m回以下続く (nかmのどちらかを指定しない場合も、カンマは除かない) |
| | 左右の選択肢のどちらかに一致 |
[] | 括弧内のどれかに一致(or) |
[^] | 括弧内のどれかに一致しない(nor) |
() | 括弧内をグループ化 |
^ | 行の頭を表す |
$ | 行の末尾を表す |
これらのメタ文字を表現のパターン内で用いたい場合は、バックスラッシュ(windows環境下では\マーク)でエスケープする必要があります。
また、文字クラスというパターンを使うことで、より簡素な表現が可能になります。主に[]内で連続したアルファベットや数字 を指定したい場合に、[A-Z]のようにハイフンを用いることでそれが可能になります。ただし、アルファベットの場合は大文字と 小文字が区別されます。
これらの規則を用いてパターンマッチングを行う場合は、ereg()関数を用います。 マッチさせるパターンを第一引数、対象となる変数を第二引数にとります。 また第三引数に配列を指定すると、マッチした部分をその配列に格納します。 ereg()変数はマッチ時の返値としてマッチした数を返します。
<?php
$sampleword=explode(":","goo:google:yahoo");
$patterne_1="^g.+$"; //先頭が
$patterne_2="^.+oo$"; //末尾が
for($x=0;$x<3;$x++){
if(ereg($patterne_1,$sampleword[$x]))
echo"$x:$sampleword[$x]<br>";
}
?>
また、マッチした部分に対して置換を行うereg_replace()関数もあります。
パターンを第一引数、置換後の文字列を第二引数、対象となる文字列を第三引数に取ります。
2-2.Perl互換の正規表現
Perl互換の正規表現は、POSIX拡張正規表現よりも一般的に動作が速く、また文法も多彩です。Perlの分野に踏み込んでしまうためここ
では細かな解説はしません。
こちらの正規表現のパターンを使ってマッチングを行う場合には、PCRE関数を用います。
PHPリファレンスのPCREのページ