正規表現で何ができる?PHPでの使い方などを解説
正規表現はユーザーから情報を受け取った際や、内部的な処理の場面でもよく使われるものです。適切に正規表現をしておかなければ不安定な状態になってしまいます。
ここでは、PHPにおいて正規表現がどのように使われ、どのようにして記述するのか解説をしていきます。
正規表現とは
文字列等に対して様々な操作を行う場合「正規表現」が用いられます。正規表現とは、あるルールやパターンを使って、特定の文字列を検索や抽出をするなど、加工を施すことのできるものです。複雑さもあり、使い方には注意が必要ですが活用される場面も多いです。
PHPを使ってWebアプリを作成したいのであれば、正規表現を使いこなすことが必要になります。
どういう情報か判定できる
正規表現でできることを簡単に説明すると、入力フォームから打ち込まれた文字列をメールアドレスとして判断することや、7桁の数字を郵便番号と読み取ることなどができます。
例えばメールアドレスの場合、多くは@を挟んで前後で文字列の持つ意味合いが異なります。@より前はユーザーが設定する任意の文字列、@より後ろではドメイン部分となります。正規表現の基本的な機能として、ある文字を探す、ということができます。そのため@を探し出して、入力された文字がメールアドレスとして有効な形となっているのかどうか判定できます。
郵便番号であれば、入力の際にハイフンを打つ場合と打たない場合とがあります。入力フォームでその判断ができなければ、ユーザーがどっちのタイプでも入力してくる可能性があるため、それぞれに対応する必要があります。ハイフンがあったとしても、それより前の3桁の数字および後ろ部分の4桁を抜き出して、7つの数字が並んだ形で管理していくことも可能となります。
特にPHPという言語はWeb関連で多く使用されるため、ログイン機能やお問い合わせ機能などを設けることが多いです。正しく正規表現を使用できなければセキュリティにも問題が生じるため、使い方には注意が必要です。
PHPの正規表現でよく使われている記号
正規表現を行う場合、記号が羅列されることになり、各記号の意味を知っておかなければ混乱することがあります。そこでPHPで使われることの多い代表的な記号について説明していきます。
デリミタとメタ文字
デリミタとは区切りを意味するものです。正規表現を扱うにはこのデリミタを適切に使用していく必要があります。スラッシュ「/」やハッシュ記号「♯」が用いられるケースが多いです。上記のプログラムではスラッシュを使用しています。 メタ文字は正規表現でパターンを表すための特殊な記号のことです。例えば以下のようなものがあります。
\ | エスケープ文字 |
^ | 行頭にマッチ |
$ | 行末にマッチ |
- | 文字の範囲指定 |
| | (左)または(右)のマッチ |
() | グループ化 |
[^] | 角括弧内以外の文字にマッチ |
PHPにおける正規表現
PHPでは多くの正規表現構文が用意されています。「preg_match」「preg_match_all」「preg_replace」などは基本的な関数ですので、まずはこれらをマスターしていきましょう。
基本的な処理
「preg_match」を使った正規表現の例を見てみましょう。
$str = 'abcd1234';
$pattern = '/[a-z]/';
if (preg_match($pattern, $str, $match)) {
var_dump($match);
}
これを実行すると、
array(1) { [0]=> string(1) "a" }
と表示されます。
この正規表現では、最初に変数strにabcd1234を入れておいて、変数patternでパターンを設定しています。そして関数preg_matchで処理を行います。
preg_matchは戻り値としてパターンにマッチした回数を返し、そしてこの場合最初にマッチした時点でマッチングが終了されるため1が返されます。当然、文字列を含まない場合にはマッチしないため0が返されます。これがifの中でtrueと同じ扱いを受け、var_dump($match)が実行されます。
「preg_match_all」を使った正規表現についても見ていきます。
preg_matchとは異なり、1回のマッチでマッチングを止めません。正規表現が行われる対象の文字列において、パターンに一致するものすべてを抽出するまで続きます。
上のプログラムで関数preg_match_allに置き換えてみましょう。
$str = 'abcd1234';
$pattern = '/[a-z]/';
if (preg_match_all($pattern, $str, $match)) {
var_dump($match);
}
実行結果は以下のようになります。
array(1) {
[0]=> array(4) {
[0]=> string(1) "a"
[1]=> string(1) "b"
[2]=> string(1) "c"
[3]=> string(1) "d"
}
}
関数を変えただけですが、出力されるものがaだけでなくa、b、c、d、と指定したパターンに該当するすべての文字が抽出されています。
続いて「preg_replace」についても説明します。
こちらは文字列の置換を行う関数です。例えば以下のように格納されたデータの順番を入れ替えることができます。
$num = '1234';
$pattern = '/(\d{1})(\d{1})(\d{1})(\d{1})/';
$replace = '$4$3$2$1';
$result = preg_replace($pattern, $replace, $num);
echo $num,"\n";
echo $result;
これを実行すると変数numでは1234、変数resultでは4321が表示されます。preg_replaceの第1引数にはパターン、第2引数ではどのように置換をするのか指定します。第1引数ではこの場合数字を1つずつ指定しており、$1や$2といった形で操作することが可能になります。
注意点
正規表現にはPCREとPOSIX拡張という正規表現エンジンがあり、それぞれで使用される関数はpreg、もしくはeregで始まります。このように2種類があるものの、ereg系は推奨されておらず、基本的にPHPで正規表現を行う場合にはpreg系を使用します。
preg系にも関数がいくつかあり、色んな場面に応じて判定を行っていくことができます。ただし、正規表現を使用しなくても判定が可能なケースもあるため、色々な視点から関数を選択するようにしましょう。判定の方法によっては処理に時間がかかってしまいページの速度を落としてしまう原因にもなってしまいます。
まとめ
正規表現では記号が多く使われるため難しく感じますが、Web制作には必要な知識となるので頑張って覚えましょう。
関数についても使い方を覚え、どの引数がどの意味を持つのか、そしてどのように正規表現が行われるのか仕組みを理解しましょう。
使いこなすことができればとても便利なものなので、PHPで何かWeb制作をしたい場合などには身につけておくと良いでしょう。
TECH PLAYでは、エンジニアの方向けに勉強会・イベント情報を提供しています。
ご興味のある方はぜひご参加ください。