PHP 正規表現

正規表現とは、検索パターンを形成する文字のシーケンスです。テキスト内でデータを検索する際に、この検索パターンを使用して検索対象を記述します。

正規表現は単一の文字である場合も、より複雑なパターンである場合もあります。

正規表現は、あらゆる種類のテキスト検索およびテキスト置換操作に使用することができます。

構文

PHPでは、正規表現はデリミタ、パターン、オプションの修飾子からなる文字列です。


$exp = "/codelabsJP/i";

上記の例では、/がデリミタであり、codelabsJPが検索されるパターンで、iは検索を大文字小文字を区別しないようにする修飾子です。

デリミタは、文字、数字、バックスラッシュ、スペース以外の任意の文字である必要があります。最も一般的なデリミタはスラッシュ(/)ですが、パターンにスラッシュが含まれる場合は#や~などの他のデリミタを選ぶと便利です。

正規表現関数

PHPには、さまざまな正規表現を使用する関数が用意されています。

最も一般的な関数は以下の通りです:

関数 説明
preg_match() 文字列内でパターンが見つかれば1を返し、見つからなければ0を返す
preg_match_all() 文字列内でパターンが見つかった回数を返す。見つからなければ0を返すこともある
preg_replace() 文字列内のパターンに一致するすべての部分を別の文字列で置換した新しい文字列を返す

preg_match()の使用

preg_match()関数は、文字列にパターンが一致するかどうかを調べます。

大文字小文字を区別せずに文字列内で「codelabsJP」を検索する正規表現の使用例:


$str = "Visit codelabsJP";
$pattern = "/codelabsJP/i";
echo preg_match($pattern, $str);

preg_match_all()の使用

preg_match_all()関数は、文字列内でパターンが見つかった回数を数えます。

大文字小文字を区別せずに文字列内で「ain」の出現回数をカウントする正規表現の使用例:


$str = "The rain in SPAIN falls mainly on the plains.";
$pattern = "/ain/i";
echo preg_match_all($pattern, $str);

preg_replace()の使用

preg_replace()関数は、文字列内のパターンに一致するすべての部分を別の文字列で置換します。

大文字小文字を区別せずに「Microsoft」を「codelabsJP」に置換する正規表現の使用例:


$str = "Visit Microsoft!";
$pattern = "/microsoft/i";
echo preg_replace($pattern, "codelabsJP", $str);

正規表現の修飾子

修飾子は検索方法を変更することができます。

修飾子 説明
i 大文字小文字を区別せずに検索を実行します
m 複数行検索を行います(パターンが文字列の先頭または末尾にマッチする場合、各行の先頭または末尾にマッチします)
u UTF-8エンコードされたパターンの正しいマッチングを有効にします

正規表現のパターン

角かっこは文字の範囲を見つけるために使用されます:

説明
[abc] 角かっこ内の文字のいずれかを見つけます
[^abc] 角かっこ内の文字以外の任意の文字を見つけます
[a-z] 2つの文字の間のアルファベット文字を見つけます
[A-z] 指定された大文字の間のアルファベット文字を見つけます
[A-Z] 2つの大文字の間のアルファベット文字を見つけます
[123] 角かっこ内の数字のいずれかを見つけます
[0-5] 2つの数値の間の数字を見つけます
[0-9] すべての数字を見つけます

メタ文字

メタ文字は特別な意味を持つ文字です:

メタ文字 説明
| cat|dog|fishのように|で区切られたパターンのいずれかに一致します
. 任意の1文字に一致します
^ 文字列の先頭に一致します (^Hello)
$ 文字列の末尾に一致します (World$)
\d 任意の数字に一致します
\D 数字以外の任意の文字に一致します
\s 任意の空白文字に一致します
\S 空白文字以外の任意の文字に一致します
\w アルファベット(a〜Z)および数字(0〜9)に一致します
\W アルファベットおよび数字以外の文字に一致します
\b \bWORDのように単語の先頭に、またはWORD\bのように単語の末尾に一致します
\uxxxx 16進数xxxxで指定されたUnicode文字に一致します

量指定子

量指定子は数量を定義します:

量指定子 説明
n+ 少なくとも1つのnを含む任意の文字列に一致します
n* nの出現回数が0回以上の任意の文字列に一致します
n? nの出現回数が0回または1回の任意の文字列に一致します
n{3} 3つのnの連続に一致する任意の文字列に一致します
n{2,5} 2回以上5回以下のnの連続に一致する任意の文字列に一致します
n{3,} 3回以上のnの連続に一致する任意の文字列に一致します

注意: 正規表現で特殊文字を検索する場合は、バックスラッシュ(\)を使用してエスケープする必要があります。たとえば、1つ以上の疑問符を検索するには、次のように表現します: $pattern = ‘/\?+/’;

グループ化

パターン全体に量指定子を適用するために括弧()を使用することができます。また、パターンの一部をマッチさせるためにも使用できます。

baの後にnaが2回続く「banana」を検索するためにグループ化を使用する例:


$str = "Apples and bananas.";
$pattern = "/ba(na){2}/i";
echo preg_match($pattern, $str);