PHPの正規表現エンジンとチェックツール5選

PHPの正規表現エンジンとチェックツール5選

PHPの正規表現の内容に入る前に簡単におさらいします。PHPとは、動的なウェブページを作成することを目的としたWebのプログラミング言語であり、Web系サーバーサイド言語です。日本ではJavaに次いで人気の高いプログラミング言語になります。今回は、このPHPの「正規表現」についてご紹介していきます。

【目次】
PHPの正規表現の基礎
正規表現とは
文字クラスとは
基本的な正規表現「マッチング」
PHPの正規表現の種類
PHPの正規表現の基本的文字一覧
メタ文字とは
PHPで使用する基本的なメタ文字
正規表現関数
PHPの正規表現の使い方
手軽にPHPの正規表現をチェックできるツール5選

PHPの正規表現の基礎

正規表現とは

正規表現とは、文字列の集合を一つの文字列で表現する方法です。元々は形式言語理論において正規言語を表すための手段として導入されておりましたが、その後、様々な記法が付け加えられています。少し前まではテキストエディタやツールで使用されていましたが、現在の正規表現はほとんどスクリプト言語で使用しています。

文字クラスとは

正規表現を作成する時に対象になる文字パターンを指定する「文字クラス」というものが存在します。この文字クラスは、自分で定義することが出来るうえ、定義済みの文字クラスを使うことも出来ます。文字クラスの使い方は、クラスは[角カッコ]内で指定します。

また、文字クラスは[各カッコ]を使用せず省略して記述することも可能です。下記に一部ご紹介します。

  文字クラス 意味 略記法
[0-9] 数字 \d
[^0-9] 数字以外の文字 \D
[ \t\r\n] スペース \s
[^ \t\r\n] スペース以外の文字 \S
[A-Z] 任意の大文字 \u
[^A-Z] 任意の大文字以外 \U
[a-z] 任意の小文字 \l
[^a-z] 任意の小文字以外 \L

基本的な正規表現「マッチング」

特定のパターンを持っているか調べる正規表現で「マッチング」というものがあります。これはPHPだけではなく、他のプログラミング言語の正規表現でも使います。

このマッチングは4つのパターンがあります。
・文字列の先頭から調べる
・文字列の先頭から調べた位置でマッチしなかった場合は、次の文字に移動して再調査
・途中でマッチした場合は、その位置でマッチングを終える
・マッチするものがない場合は、文字列を最後まで調べて終わる
上記の通り、基本的には左側から始まりマッチングした時点で終了します。

PHPではなくRubyですが、別コラムでマッチングの動きを画像で解説しておりますので、ご参照ください。

PHPの正規表現の種類

PHPには、正規表現の文法を解釈し、パターンマッチングを行うための処理プログラム用のエンジンが用意されています。

POSIX

POSIXは、拡張正規表現を扱う正規表現エンジンで、扱う関数は「ereg」で始まります。ただし、セキュリティが弱くPHP5.3以降で非推奨のためおすすめできません。

PCRE

PCREは、Perl互換の正規表現エンジンで、扱う関数は「preg」で始まります。

mbregex

mbregexは、Rubyの「鬼車」という正規表現エンジンですがPHPでも使用出来ます。扱う関数は「mb」で始まります。

PHPの正規表現の基本的文字一覧

メタ文字とは

正規表現の中に良く出てくる「メタ文字」とは何でしょうか。メタ文字とは、文字本来の意味とは異なり、プログラムで特別な意味を持たせた文字のことを指します。例えばですが、正規表現で使用される1回以上の連続文字を意味するメタ文字は「+」です。これは本来の足すという意味ではなく連続を意味します。メタ文字で1+1と表示されていた場合は、11、111、1111などに一致します。

メタ文字は、環境や機能の中で任意に意味が決められているため、環境に応じて使用するメタ文字は何を意味するのか把握しておく必要があります。今回は、Rubyの正規表現で使用する基本的なメタ文字をご紹介します。
(引用:Rubyの正規表現の基礎知識と基本的なメタ文字一覧)

PHPで使用する基本的なメタ文字

メタ文字 意味
^ 行頭にマッチ
$ 行末にマッチ
. 改行を除いた任意の1文字
? 0もしくは1回だけの文字
* 直前の表現に0回以上連続する文字
+ 直前の表現に1回以上連続する文字
[ ] 文字クラス
( ) パターングループ
{ } 量指定子
| or
\n 改行
\r カーソルを文頭へ戻す(キャリッジリターン)
\t タブ
\d 数字
\D 数字以外
\w 英数字
\W 英数字以外
\s スペース
\S スペース以外
\b 単語境界線
\B 単語境界線以外
\x?? 16進数
\ エスケープ文字
文字範囲の指定

正規表現関数

POSIX関数

関数 意味
ereg 正規表現によるマッチング
ereg_replace 正規表現による置換
eregi 大文字小文字を区別せずに正規表現による置換
eregi_replace 大文字小文字を区別せずに正規表現によるマッチング
split 正規表現によって分割して文字列を配列に格納
spliti 大文字小文字を区別せずに正規表現によって
分割して文字列を配列に格納
sql_regcase 大文字小文字を区別せずにマッチングのための正規表現を作成

PCRE関数

関数 意味
preg_filter 正規表現による検索・置換
preg_grep パターンにマッチする要素を返す
preg_match 正規表現によるマッチングをする
preg_quote 正規表現の文字をクオートする
preg_replace 正規表現検索と置換を行う
preg_split 正規表現で文字列を分割する
preg_last_error 直前の PCRE 正規表現処理のエラーコードを返す
preg_match_all 繰り返し正規表現検索をする
preg_replace_callback_array 正規表現検索をし、コールバック関数を使用して置換える

mbregex関数

関数 意味
mb_ereg_match マルチバイト文字列が正規表現に一致するか調べる
mb_ereg_search 指定したマルチバイト文字列が正規表現に一致するか調べる
mb_eregi_replace マルチバイト文字列に大文字小文字を区別せずに正規表現による置換をする
mb_ereg_search_pos 指定したマルチバイト文字列が正規表現に一致する個所の位置と長さを返す
mb_ereg_search_init マルチバイト正規表現検索用の文字列と正規表現を設定
mb_ereg_search_regs 指定したマルチバイト文字列が正規表現に一致する部分を取得

(参照:PHPマニュアル

PHPの正規表現の使い方

正規表現で出来る事は、主に文字列で「調べる」「抜き出す」「置き換える」の3つです。

PHPには正規表現のリテラルがありませんので、正規表現パターンは文字列として記述します。そのため「’」で囲みますが、間違えて「”」にしてしまうと、変数展開される場合がありますのでご注意下さい。「’」をリテラルとする場合のエスケープは「\」になります。それ以外の場所で使用する「\」は、全て「\」そのものとして扱われます。

ただし、正規表現では「\」はメタ文字として扱われるため、「\\」でエスケープする必要があります。そうなると、「\」にマッチする正規表現の場合は「\\\\」と4つ並べる必要があります。最初はややこしくてわかり難いですが、覚えてしまえばすぐに慣れます。

【正規表現の例が載っているサイト】
PHPマニュアル/ PCRE のパターン
PHPマニュアル/ POSIX Regex正規表現の例
PHPのpreg_matchで正規表現によるマッチングする方法
TRY PHP/正規表現サンプルコード
正規表現サンプル12選

手軽にPHPの正規表現をチェックできるツール5選

正規表現チェッカー
PHPとJavaScriptの正規表現を記述する際の動作チェックなどに使用出来ます。正規表現と対象になる文字列を入力することで実行結果が確認出来ます。

PHP正規表現チェッカー
PHP専用の正規チェックを行うツールです。「preg_match」「preg_match_all」「preg_replace」「preg_split」の4つを確認出来ます。

正規表現デバッグツール – LANDHERE
PHPのPCRE(preg)系の正規表現を確認するツールです。「preg_match」「preg_match_all」の処理結果を確認出来ます。

Rex V
PHPのPCRE、POSIXはもちろん、PerlやPythton、JavaScript、Node.JSの正規表現をこのツール1つで確認することが出来ます。

PHP Live Regex
PHPの正規表現をリアルタイムに動作確認出来るツールです。「preg_match」「preg_match_all」「preg_replace」の3つを確認することが出来ます。