正規表現

正規表現とは、文字列の集合を表現する方法です。
電話番号やメールアドレス、郵便番号、パスワードなどが規格にあってるかを確かめたり、特定の文字列のパターンに対して処理を行う時などに使います。
PHPではPerl互換のPCREの正規表現を使うのが基本です。POSIX拡張正規表現(ereg)も使用することが出来ましたがPHP5.3以降は非推奨となっています。
PCREの正規表現を扱う関数はpregから始まる名称がついています。

PCRE正規表現構文

PCRE正規表現を使うためにはPCRE正規表現構文を理解しておく必要があります。
詳細は PHP: PCRE 正規表現構文 - Manual を参照してください。
また、ここから先の多くの部分を上記サイトより引用しました。

デリミタ

デリミタは,データの区切りを示す文字符号のことです。PCRE関数を使うときはパターンをデリミタで囲む必要があります。
デリミタは、英数字、バックスラッシュ、空白文字以外の任意の文字を使うことができますが、
パターンの中でデリミタとなっている文字を使いたい場合はバックスラッシュでエスケープする必要があるため
パターンの中であまり使われていない文字を使うことが推奨されます。
デリミタとしてよく使われる文字は、スラッシュ (/)、 ハッシュ記号 (#) およびチルダ (~) です。

例:デリミタがスラッシュ (/)の場合
/foo bar/
例:ハッシュ記号 (#) の場合
#^[^0-9]$#

メタ文字

正規表現で選択肢やパターンなどを表す特殊な文字をメタ文字と言います。

角カッコ ([ ]) 外で使用できるメタ文字(php.netより引用)
記号 説明
\ 多目的に使う一般的なエスケープ文字
^ 検索対象(複数行モードでは行)の始まりを言明
$ 検索対象の終わりあるいは終端の改行文字の前(複数行モードでは行の終わり)を言明
. 改行を除くすべての文字にマッチ(デフォルト時)
[ 文字クラス定義の開始
] 文字クラス定義の終了
| 選択枝の開始
( サブパターンの開始
) サブパターンの終了
? ( の意味を拡張/0 または 1 回マッチ/なるべく少ない回数だけマッチ
* 0 回以上の繰り返し
+ 1 回以上の繰り返し
{ 最小/最大を指定する量指定子の開始
} 最小/最大を指定する量指定子の終了


文字クラス

角カッコ ([ ]) の内側を文字クラスと言います
文字クラスはマッチさせたい文字の候補群を入れておきます。
数字を含んでいることを表したい場合は「/[0-9]/」のようになります。

角カッコ ([ ]) 内でも使用できるメタ文字(php.netより引用)

記号 説明
\ 一般的なエスケープ文字
^ クラスの否定。ただし、文字クラスの最初の文字に用いた場合のみ
- 文字の範囲の指定

それぞれの詳細に関しては公式マニュアルを参照してください。

エスケープシーケンス

正規表現構文の中で意味を持ってしまう文字自体を使用したい場合にはその文字の前にバックスラッシュを表記します。
例えば「*」は正規表現構文では「0 回以上の繰り返し」を表す記号として認識されしまいます。
「*」自体を表したい場合は「\*」のようにその文字の直前にバックスラッシュを書くことで表すことができます。

バックスラッシュの第2の使用方法は、目に見えない文字をバックスラッシュに英数字を続けて見えるように表記することができます。

記号 説明(php.netより引用)
\a アラーム、ベル文字 (16進 07)
\cx “control-x”, ここで x は任意の文字
\e エスケープ文字 (16進 1B)
\f 改ページ (formfeed) (16進 0C)
\n 改行 (newline) (16進 0A)
\p{xx} xx プロパティを持つ文字、詳細は下記のunicodeプロパティを参照
\P{xx} xx プロパティを持たない文字、詳細は下記のunicodeプロパティを参照
\r 復帰 (carriage return) (16進 0D)
\t タブ (16進 09)
\xhh 16 進コードで hh の文字
\ddd 8 進コードで ddd の文字

バックスラッシュ第3の使用方法としては、包括的な文字型を指定する用途です。

記号 説明(php.netより引用)
\d 10 進数字
\D 10 進数字でない文字
\h 水平方向の空白文字 (PHP 5.2.4 以降)
\H 水平方向の空白文字でない文字 (PHP 5.2.4 以降)
\s 空白文字
\S 空白文字でない文字
\v 垂直方向の空白文字 (PHP 5.2.4 以降)
\V 垂直方向の空白文字でない文字 (PHP 5.2.4 以降)
\w 単語構成文字 (word character)
\W 非単語構成文字 (non-word character)

第4の使用法は、簡単な言明です。言明とは、マッチがある特定の位置でだけ可能だという条件を指定するもので、
検索対象文字列から文字を消費しません。

記号 説明(php.netより引用)
\b 単語境界
\B 非単語境界
\A 検索対象文字列の始端(複数行モードとは独立)
\Z 検索対象文字列の終端、または終端の改行(複数行モードとは独立)
\z 検索対象文字列の終端(複数行モードとは独立)
\G マッチングの開始位置


Unicode文字プロパティ


UTF-8モードを指定した場合に、Unicodeでカテゴリが規定されているものを指定することが出来ます。

プロパティ マッチ(php.netより引用)
C その他 (Other)
Cc コントロール文字 (Control)
Cf 非可視整形用文字 (Format)
Cn 未定義コードポイント (Unassigned)
Co 私的利用領域 (Private use)
Cs サロゲート (Surrogate)
L アルファベット (Letter)
Ll 小文字アルファベット (Lower case letter)
Lm 擬似文字 (Modifier letter)
Lo その他の文字 (Other letter)
Lt タイトル文字 (Title case letter)
Lu 大文字アルファベット (Upper case letter)
M 記号 (Mark)
Mc 修飾文字 (Spacing mark)
Me 他の文字を囲むための文字 (Enclosing mark)
Mn 他の文字を修飾するための文字 (Non-spacing mark)
N 数字 (Number)
Nd 10 進数字 (Decimal number)
Nl 数値を表す文字 (Letter number)
No その他の数字 (Other number)
P 句読記号 (Punctuation)
Pc 連結用句読記号 (Connector punctuation)
Pd ダッシュ (Dash punctuation)
Pe 閉じ句読記号 (Close punctuation)
Pf 末尾句読記号 (Final punctuation)
Pi 先頭句読記号 (Initial punctuation)
Po その他の句読記号 (Other punctuation)
Ps 開き句読記号 (Open punctuation)
S 記号 (Symbol)
Sc 通貨記号 (Currency symbol)
Sk 合わせ文字 (Modifier symbol)
Sm 数学記号 (Mathematical symbol)
So その他の記号 (Other symbol)
Z 区切り文字 (Separator)
Zl 行区切り文字 (Line separator)
Zp 段落区切り文字 (Paragraph separator)
Zs 空白文字 (Space separator)


パターン修飾子


パターン修飾子は終端デリミタの後に続けて指定することで使用することができます。
パターンマッチングの挙動を変更することができます。
修飾子(PCRE内部の名前) 説明
i (PCRE_CASELESS) この修飾子を設定すると、パターンの中の文字は 大文字にも小文字にもマッチします。
m (PCRE_MULTILINE) 行頭メタ文字(^)と行末メタ文字(^)が対象文字列に含まれる改行の前後にもマッチするようにします。
s (PCRE_DOTALL) この修飾子を設定すると、パターン中のドットメタ文字は 改行を含む全ての文字にマッチします。 これを設定しない場合は、改行にはマッチしません。
x (PCRE_EXTENDED) この修飾子を設定すると、エスケープするか 文字クラスの内部を除き、 パターンの空白文字は完全に無視されます。
A (PCRE_ANCHORED) この修飾子を設定すると、パターンは強制的に検索対象文字列の先頭でのみマッチするように制限されます。
D (PCRE_DOLLAR_ENDONLY) この修飾子を設定すると、パターン内のドルメタ文字は、検索対象文字列の 終わりにのみマッチします。この修飾子は、m を設定している場合に無視されます。
S この修飾子を設定すると、追加のパターン分析が 行われます。
U (PCRE_UNGREEDY) この修飾子を設定すると、量指定子の「貪欲さ」が反転します。 つまり、量指定子は、デフォルトで貪欲でなく、 疑問符を後ろに付けてはじめて貪欲になるようになります。
X (PCRE_EXTRA) パターン内で文字が後ろに続くバックスラッシュ で特に意味がないものをエラーにします。
J (PCRE_INFO_JCHANGED) ローカルのオプション PCRE_DUPNAMES の設定を変更します。 サブパターンで重複した名前を使用できるようになります。
u (PCRE_UTF8) パターン文字列は、UTF-8 エンコードされた文字列として処理されます。


preg関数

preg関数はPCRE正規表現構文を利用した処理を行うことができる関数です。


preg_match

preg_matchは正規表現によるマッチングを行う関数です。
preg_match([正規表現] , [対象となる文字列]);
対象となる文字列が正規表現にマッチした場合はint型の1を、マッチしなかった場合は0を返します。

例:
<?php
preg_match("/uhero/u", "デジタルエージェンシーで必要とされるテクノロジーをuheroは提供します。");
第二引数の文字列にuheroが含まれているため、返り値が1となります。


preg_replace

preg_replaceは正規表現により置換する関数です。
preg_replace([正規表現], [置換する内容], [元の文字列または文字列により構成される配列]);
返り値は置換後の文字列または配列です。

例1:
<?php
echo preg_replace("/uhero/u", "株式会社ユヒーロ", "デジタルエージェンシーで必要とされるテクノロジーをuheroは提供します。");
「デジタルエージェンシーで必要とされるテクノロジーを株式会社ユヒーロは提供します。」と出力されます。

例2:
<?php
$string = '12-20-2014';
$pattern = '/(\d+)-(\d+)-(\d+)/i';
$replacement = '$3年$1月$2日';
echo preg_replace($pattern, $replacement, $string);
「2014年12月20日」が出力されます。
正規表現のサブパターンを左から順に$1、$2、$3のように利用することが出来ます。


preg_split

preg_split関数は正規表現を用いて文字列を分割する関数です。
preg_split([正規表現], [分割する文字列]);
返り値は分割された配列です。

例:
<?php
$string = 'asdfa5dthdtnr4dt7drbdrb0drbdr1';
$pattern = '/[0-9]+/';
print_r(preg_split($pattern, $string));
出力結果
Array
(
    [0] => asdfa
    [1] => dthdtnr
    [2] => dt
    [3] => drbdrb
    [4] => drbdr
    [5] =>
)
この例では、正規表現に数字を指定することで「文字列中に数字があれば分割する」という処理になります。


preg_quote

PCRE正規表現構文では、メタ文字が多数あります。これらの文字を利用したい場合はバックスラッシュでエスケープすることで使うことが出来ます。 preg_quoteはメタ文字のエスケープを自動的に行うことが出来ます。

preg_quote([エスケープする文字列]);
返り値はエスケープされた文字列です。

例:
<?php
echo preg_quote("*very*");
出力結果
\*very\*

課題

引数で渡された文字列がEmailアドレスであるかと判定し、正しければtrueを、間違っていればfalseを返す関数をPHPで書きなさい。

Emailアドレスであるかの判定条件は以下の通りとする。
・ローカル部分とドメイン部分が「@」で区切られている。(local@domain)
・ローカル部分とドメイン部分で使用できる文字は大文字と小文字のアルファベット、英数字、そしてピリオド(.)、ハイフン(-)、アンダースコア(_)の3種類の記号のみとする。
・しかしローカル部分は1文字以上であり、始めの1文字目で記号を使用できないものとする。
・また、ドメイン部分は2文字以上であり、1文字目はピリオドが使用できないものとする。

目次

前のトピックへ

PHPのクラスとオブジェクト指向

次のトピックへ

MySQL入門

このページ

このドキュメントは Sphinx 1.2.1 で生成しました。