PHPでウェブの世界と繋がろう!
menu
ホーム > PHPの文法 > 9 正規表現 > 9-1 PHPの正規表現

9-1 PHPの正規表現

Pocket

説明

正規表現とは
POINT

  • 正規表現とは文字列の集合をパターン化して表現する文字列
    例えば、
    [0-9] は全ての数字という意
    '^pen' は pen という文字列で始まるという意
  • 正規表現とはパターン化された文字列 = 正規表現
  • 正規表現は専用の関数 preg_match() と合わせて利用する

正規表現とは文字列の集合を「パターン化して表現する文字列」のことです。

例えば、正規表現では、「全ての数字」という文字列の集合を「[0-9]」というような形で表現します。「[0-9]」がパターン化された正規表現の文字列です。他には、「penという文字列で始まる」を正規表現で表す場合「'^pen'」となります。

このように、ある文字列が「数値」であるか、「特定の文字で始まる」か、など正規表現でパターン化された文字列と照らし合わせて、調べることができます。正規表現は専用の関数 preg_match() と合わせて利用します。preg_match()などのPerl互換の正規表現関数(PCRE関数)では、正規表現をデミリタ(delimiters)で囲う必要があります。デリミタとして良く利用される文字は、「/ (スラッシュ)」「# (ハッシュ記号)」「~ (チルダ)」などです。以下の例では、「/ (スラッシュ)」を利用しています。

一致は 1、不一致は 0  = preg_match(正規表現, 文字列);

例:

if(preg_match('/[0-9]/', 'abcdefg'))
echo "数値です。<br/>\n";
else
echo "数値ではありません。<br/>\n";

if(preg_match('/[0-9]/', '0394587'))
echo "数値です。<br/>\n";
else
echo "数値ではありません。<br/>\n";

結果は

数値ではありません。
数値です。

となります。

正規表現には多くのルールがあり、このルールを組み合わせることで多様な表現を作成できます。正規表現を利用すれば、ある文字列が「メールアドレス」であるか「URL」であるかなどを調べることも可能です。つまり、ある文字列に対して複雑な検索を行う場合に検索パターンを指定するのが正規表現になります

正規表現の種類
POINT

  • PHPの正規表現は POSIX の正規表現と Perl互換(PCRE) の正規表現の2種類ある
  • POSIXの正規表現 読みやすい
    ereg() 関数を使用 ※PHP5.3で非推奨
  • Perl互換(PCRE)の正規表現 機能・速度が優れている
    preg_match() 関数を使用
  • Perl互換の正規表現では POSIX形式の文字クラスやアンカー等も利用 できる

PHPではPOSIXの正規表現Perl互換(PCRE)の正規表現の2種類をサポートしています。

POSIXの正規表現は読みやすいという特徴があります。Perl互換の正規表現は機能的にも速度的にもPOSIXより優れています。

また、正規表現とのマッチに使用する専用の関数が用意されており、POSIX正規表現とのマッチを行う関数はereg()関数で、Perl互換の正規表現とのマッチを行う関数はpreg_match()関数です。

※ereg()関数は PHP5.3 で非推奨となりました。

POSIXの正規表現とPerl互換(PCRE)の正規表現の違い
POINT

  • PCREの正規表現関数では、パターンを デリミタ で囲う必要があります。
  • PCREの正規表現関数では、大文字小文字を必ず区別します。パターン修飾子 i (PCRE_CASELESS) で大文字小文字両方にマッチする動作を指定出来ます。POSIXの正規表現関数は、大文字小文字を区別しない eregi() 関数があります。
  • POSIXの正規表現関数は、いちばん左側にある最も長くマッチするパターンを探します。一方 PCREの正規表現関数では、マッチするパターンが最初に見つかった時点で処理を終了します。マッチするパターンがある場合は結果や処理速度に大きな影響が出る可能性があります。
  • POSIX における “文字クラス” の定義は PCRE とは異なります。

正規表現の活用
POINT

  • 数値:正規表現にマッチした場合 1 、マッチしなかった場合 0 の数値を返す
    preg_match()関数を使用
  • 取り出し:正規表現にマッチした部分を取り出す
    preg_match()関数を使用
  • 差し換え:正規表現にマッチした部分を別の文字列に差し換える
    preg_replace()関数を使用
  • 分割:正規表現にマッチした部分を幾つかの文字列に分割する
    preg_split()関数を使用
  • ※ereg()関数は PHP5.3 で非推奨となりました。

正規表現は、ある文字列に対して複雑な検索を行う場合に検索パターンを指定するものと説明しましたが、ある文字列が検索パターンにマッチした場合に幾つかの処理方法があります数値を返す、取り出し、差し替え、分割 です。これらの処理にあわせた関数が用意されているので、正規表現と専用の関数を組み合わせて処理を行います。

正規表現と組み合わせて利用する関数を紹介します。

preg_match() — 正規表現によるマッチングを行う
一致は 1、不一致は 0  = preg_match(正規表現, 入力文字列 [, $matches, フラグ]);
//[ ]省略可能
preg_match() — 3つ目の引数を指定し正規表現にマッチした部分を取出す
一致は 1、不一致は 0  = preg_match(正規表現 ,入力文字列 [,$matches ,フラグ]);
//[ ]省略可能
preg_replace() – 正規表現検索および置換を行う
結果 = preg_replace(正規表現文字列や配列 ,置換する文字列や配列 ,入力文字列);
//[ ]省略可能
preg_split() – 正規表現で文字列を分割する
配列 = preg_split(正規表現, 入力文字列);
//[ ]省略可能

簡単な正規表現の例
正規表現を表す文字は殆どリテラル文字です。その文字自身にマッチすることを意味します。リテラルとは値そのもののことです。

① 正規表現 'pen' と 文字列「This is a pen」をマッチ
たとえば、「This is a pen」の文字列に対して正規表現 'pen' でマッチを行うと、文字列中に pen があるかを調べられます。

if(preg_match('/pen/', 'This is a pen'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致

となります。

マッチ動作の説明
正規表現は最初に p を探します。 p が見つかれば次の文字が e であるか調べます。 e でなければ再度次の p を探します。 e であれば次の文字が n であるか調べます。n でなければ再度次の p を探します。 n であれば正規表現はマッチ処理を完了して 数値の1 を返します。
② 正規表現 'pen' と 文字列「This is a book」をマッチ
以下は「This is a book」の文字列に対して正規表現 'pen' でマッチを行っています。

if(preg_match('/pen/', 'This is a book'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

不一致

となります。

マッチ動作の説明
正規表現は最初に p を探します。 p が見つからないので正規表現はマッチを終了して 数値の0 を返します。
③ 正規表現 'ghi' と 文字列「abcde fghij klmno」をマッチ
以下は「abcde fghij klmno」の文字列に対して正規表現 'ghi' でマッチを行っています。

if(preg_match('/ghi/', 'abcde fghij klmno'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致

となります。

マッチ動作の説明
正規表現は最初に g を探します。 g が見つかれば次の文字が h であるか調べます。 h でなければ再度次の g を探します。h であれば次の文字が i であるか調べます。 iでなければ再度次の p を探します。 i であれば正規表現はマッチ処理を完了して 数値の1 を返します。

正規表現のマッチ動作

上記の例でも説明しましたが、正規表現がどのような動きでマッチさせるか見てみましょう。

if(preg_match('/TOM/', 'This pen is given from a TOM last year. I am very much pleased with this pen.'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致

となります。

正規表現エンジンは最初に T を探します。 T が見つかったら次の文字列が O であるか調べます。O でなければ再度次の T を探します。 O であれば次の文字列が M であるか調べます。M でなければ再度次の T を探します。 M であればマッチ処理を完了して 数値の1 を返えします。
T が見つからない、T の次の O が見つからない、 TO の次の M が見つからない、これらの場合は 数値の0 を返えします。

正規表現の大文字小文字
POINT

  • 正規表現では大文字小文字を区別する

正規表現では大文字小文字を区別します。従って、以下の場合、正規表現の 'pen' は文字列中の「Pen」にマッチしません。

if(preg_match('/pen/', 'This is a Pen.'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

不一致

となります。

正規表現で特殊な意味を持つ文字
POINT

  • 正規表現で特別な意味を持つ文字
    \ (バックスラッシュ)
    ^ (キャレット)
    $ (ドル)
    . (ドット)
    ? (クエッション)
    * (アスタリスク)
    + (プラス)

正規表現を記述する場合に、特別な意味を表す文字が幾つかあります。これらの文字はより豊かな表現を実装するために必要不可欠な文字です。

\ (バックスラッシュ)
\ 正規表現中で特別な意味を持つ文字(メタ文字)が幾つかありますが、それらの特殊文字を普通の文字として扱う場合に、その特殊文字の前に「\(バックスラッシュ)」付けます。「\(バックスラッシュ)」を付けることで正規表現の特殊文字を普通の文字として扱います。

「. (ドット)」や「+ (プラス)」は正規表現内では特殊な意味を持つ文字となります。このような文字を通常の文字として扱う場合は、その文字の前に「\ (バックスラッシュ)」記号を配置します。

正規表現内で特殊文字をそのまま使用した場合。

if(preg_match('/1.2 + 1.2/', '1.2 + 1.2 = 2.4'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

不一致

となります。

正規表現内で特殊文字の前に「\」記号を配置した場合。

if(preg_match('/1\.2 \+ 1\.2/', '1.2 + 1.2 = 2.4'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致

となります。

^ (キャレット)
^ 検索条件の表現を表します。
文字列の先頭から正規表現でマッチさせる場合に使用します。
この特殊文字の次に指定された文字列で始まっていれば」条件に適合したと判断します。

以下の例では特殊文字「^」の次に指定されている This で始まる文字列であれば条件に適合したと判断されます。

if(preg_match('/^This/', 'This is a pen'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致

となります。

if(preg_match('/^This/', 'That is Suzuki\'s pen'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

不一致

となります。

$ (ドル)
$ 検索条件の表現を表します。
文字列の最後の部分と正規表現でマッチさせる場合に使用します。
この特殊文字の前に指定された文字列で終っていれば」条件に適合したと判断します。

以下の例では特殊文字「$」の前に指定されている pen. で終わる文字列であれば条件に適合したと判断されます。

if(preg_match('/pen.$/', 'This is a pen.'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致

となります。

if(preg_match('/pen.$/', 'This is a book.'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

不一致

となります。

. (ドット)
. 検索条件の表現を表します。
文字列の任意の一字にマッチさせる場合に使用します。
\n (改行)以外の任意の文字を表します。

if(preg_match('/b.g/', 'bug'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致

となります。

if(preg_match('/b.g/', 'bag'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致

となります。

if(preg_match('/b.g/', 'dog'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

不一致

となります。

? (クエッション)
? 検索条件の表現を表します。
この文字の前に指定された文字が1個だけ使われているか、あるいは使われていない場合「0回あるいは1回ということ」に条件に適合したと判断します。

以下の場合「o」は「0回」使用されているので、

if(preg_match('/do?g/', 'dg'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致

となります。

以下の場合「o」は「1回」使用されているので、

if(preg_match('/do?g/', 'dog'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致

となります。

以下の場合「o」は「2回」使用されているので、

if(preg_match('/do?g/', 'doog'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

不一致

となります。

* (アスタリスク)
* 検索条件の表現を表します。
この文字の前に指定された文字が0個以上使われていれば、条件に適合したと判断します。

以下の場合「o」は「0回」使用されているので、

if(preg_match('/do*g/', 'dg'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致

となります。

以下の場合「o」は「0回以上」使用されているので、

if(preg_match('/do*g/', 'dog'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/do*g/', 'doooooooooooooooooooog'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致
一致

となります。

+ (プラス)
+ 検索条件の表現を表します。
この文字の前に指定された文字が1個以上使われていれば、条件に適合したと判断します。

以下の場合「o」は「0回」なので、

if(preg_match('/do+g/', 'dg'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

不一致

となります。

以下の場合「o」は「1回以上」使用されているので、

if(preg_match('/do+g/', 'dooooooooooog'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致

となります。

文字クラス
POINT

  • 文字クラスとは文字のパターン
  • 文字クラスは [ ](角括弧) で指定
  • 文字クラスは自分で定義可能。また、定義済み文字クラスもある

文字クラスとは、正規表現を作成する際対象となる文字のパターンを指定するのに利用します。対象となる文字は「[ ](角括弧)」内で指定します。文字クラスは自分で定義することが出来ます。また、定義済みの文字クラスを利用することも出来ます。

文字クラスの作成 「 [・・・] (角括弧) 」を使用
それでは文字クラスを作成してみましょう。文字クラスを作成するには、「 [・・・] (角括弧) 」を使用します。以下は文字列に対して正規表現の文字クラスを表す 'd[aiueo]g' でマッチを行っています。文字クラス [aiueo] は、aiueo の何れか という意味になります。

例:

if(preg_match('/d[aiueo]g/', 'word dzg word dog word'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/d[aiueo]g/', 'word dzg word dtg word dob word'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致
不一致

となります。

マッチ動作の説明
正規表現は最初に d を探します。 d が見つかれば次の文字が aiueo の何れかであるか調べます。 aiueo の何れかでなかった場合は再度次の d を探します。 aiueo のいずれかであれば次の文字が g であるか調べます。g でなければ再度次の d を探します。 g であれば正規表現はマッチ処理を完了してTREUを返します。

文字クラスの否定 「 ^ (キャレット) 」を使用
文字クラスの否定を行うには、クラスの先頭に「^(キャレット)」を配置します。

例えば
[^abc]
とすると、abc以外の文字という意味になります。

以下は文字列に対して正規表現の文字クラス否定を表す 'd[^aiueo]g' でマッチを行っています。

例:

if(preg_match('/d[^aiueo]g/', 'word deg word dog word'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/d[^aiueo]g/', 'word dzi word dtg word dob word'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

不一致
一致

となります。

マッチ動作の説明
正規表現は最初に d を探します。 d が見つかれば次の文字が aiueo 以外の何れかであるか調べます。 aiueo 以外の何れかでなかった場合は再度次の d を探します。 aiueo 以外のいずれかであれば次の文字が g であるか調べます。g でなければ再度次の d を探します。 g であれば正規表現はマッチ処理を完了してTREUを返します。

文字クラス範囲 「 – (ハイフン) 」
文字クラスの範囲を指定するには、「-(ハイフン)」を使用します。
例えば
[0-9]

[0123456789]
と同じ意味で、全ての半角数字を意味します。
[a-z]

[abcdefghijklmnopqrstuvwxyz]
と同じ意味で、全ての半角小文字アルファベットを意味します。

その他に、
[ぁ-んー] ひらがなを表します。
[ァ-ヴー] カタカナを表します。
[a-zA-Z] 半角小文字大文字アルファベットを表します。
[0-9] 半角数字を表します。
[!#:&~@+$\(\)\[\]a-zA-Z0-9_-] 英数字記号を表します。
などがあります。

例:

if(preg_match('/[0-9]円/', 'この鉛筆に1本100円の値札が付いています。'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/[0-9]円/', 'この鉛筆に1本百円の値札が付いています。'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致
不一致

となります。

マッチ動作の説明
正規表現は最初に 0 から9 何れかの数字を探します。 数字が見つかれば次の文字が 円 であるか調べます。 円 でなかった場合は再度次の 0 から9 何れかの数字を探します。 円 であれば正規表現はマッチ処理を完了してTREUを返します。

文字クラス内部の特殊文字
文字クラス内部では正規表現で特殊な意味を持つ特殊文字の扱いが変わることがあります。

POINT

  • $ (ドル)」は文字クラス内部では通常の記号となります。
    文字の終わりという意味はなくなります。
  • . (ピリオド)」は文字クラス内部では通常の記号となります。
    任意の一文字という意味はなくなります。
  • ^ (キャレット)」開始括弧直後に配置された場合に否定を意味します。文字の先頭という意味はなくなります。

以下は、

[^\]]

] 」 以外の文字すべてという意味です。

if(preg_match('/[^\]]/', ']'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

不一致

となります。
「 ] 」以外の文字であれば全て一致なのですが、唯一「 ] 」のみ不一致なので、結果は不一致となります。

以下は、

[$^.]

「 $ ^ . 」 の何れかという意味です。

if(preg_match('/[$^.]/', 'abcdefg$higklmn'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/[$^.]/', 'abcdefg^higklmn'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/[$^.]/', 'abcdefghigklmn'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致
一致
不一致

となります。
最後の検索対象文字列は「 abcdefghigklmn 」であり、$ ^ . の何れもありませんので、不一致となります。

さまざまな文字クラス
PHPには定義済みの文字クラスが用意されています。

[:alnum:] 半角英数字[:alpha:]+[:digit:] [0-9a-zA-Z]
[:alpha:] 小文字大文字の半角英字[:lower:]+[:upper:] [a-zA-Z]
[:lower:] 小文字の半角英字 [a-z]
[:digit:] 数字 [0-9]
[:blank:] スペースとタブ [ \t]
[:cntrl:] 制御文字 [\x01-\x20]
[:graph:] 可視文字(空白や制御文字以外の文字)[:alnum:]+[:punct:] [^\x01-\x20]
[:print:] 印字可能文字[:alnum:]+[:punct:]+スペース [\t\x20-\xFF]
[:punct:] 様々な記号・句読点 [-!”#$%&'()*+,./:;<=>?@[\\\]^_`{|}~]
[:space:] スペース、タブ、改ページ [\n\r\t \xoB]
[:upper:] 大文字の半角英文字 [A-Z]
[:xdigit:] 16進数 [0-9a-fA-F]

文字クラス範囲 「 – (ハイフン) 」を利用して作成する場合の例です。

[0-9] 半角英数字
[a-z] 小文字の半角英文字
[A-Z] 大文字の半角英文字
[a-zA-Z] 小文字大文字の半角英文字
[a-z] 小文字の全角英文字
[A-Z] 大文字の全角英文字
[a-zA-Z] 小文字大文字の全角英文字
[!#:&~@+$\(\)\[\]a-zA-Z0-9_-] 英数字記号
[ぁ-んー] ひらがな
[ァ-ヴー] カタカナ
[ぁ-んーァ-ヴー] ひらがな カタカナ
[^一-龠] 漢字

選択肢「 | (パイプ)」
POINT

  • | (パイプ)」で選択肢の作成

「 | (パイプ)」を使用して正規表現内で選択肢を作成できます。
例えば

'bag|hat'

これは、bag か hat どちらかの文字列がある場合という意味になります。

if(preg_match('/11|12/', '2 3 5 7 11 13 17'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致

となります。

if(preg_match('/9|10/', '2 3 5 7 11 13 17'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

不一致

となります。

繰り返し(量指定子)
POINT

  • 繰り返し(量指定子)のパターンを作成
    ? 0回または1回
    * 0回以上
    + 1回以上
    {n} n回
    {n,} n回以上
    {n, m} n回以上、m回以下

正規表現で何度繰り返すか繰り返しのパターンを指定することが出来ます。この繰り返しを表現するのが量指定子になります。

例えば

'boa*t'

の場合、量指定子「 * 」は、0回以上という意なので、bot boat boaaaaaaaaaat 何れでもマッチします。
それでは、各量指定子の動作を確認してみましょう。

「 ? 」0回または1回
量指定子 ? は、0回または1回を意味します。

if(preg_match('/boa?t/', 'boat'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/boa?t/', 'boaat'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致
不一致

となります。

「 * 」0回以上
量指定子 * は、0回以上を意味します。

if(preg_match('/boa*t/', 'bot'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/boa*t/', 'boaaaaaaaaaat'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致
一致

となります。

「 + 」 1回以上
量指定子 + は、1回以上を意味します。

if(preg_match('/boa+t/', 'boaaaaaaaaaat'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/boa+t/', 'bot'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致
不一致

となります。

「 {n} 」n回
量指定子 {n} は、n回を意味します。

if(preg_match('/boa{3}t/', 'boaaat'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/boa{3}t/', 'boat'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致
不一致

となります。

「{n,}」n回以上
量指定子 {n,} は、n回以上を意味します。

if(ereg('boa{5,}t', 'boaaaaaat'))
if(preg_match('/boa{5,}t/', 'boaaaaat'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/boa{5,}t/', 'boaaaat'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致
不一致

となります。

「{n,m}」n回以上、m回以下
量指定子 {n,m} は、n回以上 m回以下を意味します。

if(preg_match('/boa{1,3}t/', 'boat'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/boa{1,3}t/', 'boaaat'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/boa{1,3}t/', 'boaaaat'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致
一致
不一致

となります。

サブパターン(単位を作る)
POINT

  • () 括弧 でサブパターンを作成

「 () 」括弧で囲むとその部分を1つの単位として扱うことができます。

例えば

'( word){2}'

word 」の文字列が正確に2回という意味になります。

if(preg_match('/( very){2}/', 'She is very very good at a song.'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

if(preg_match('/( very){3}/', 'She is very very good at a song.'))
echo "一致<br/>\n";
else
echo "不一致<br/>\n";

結果は

一致
不一致

となります。

エスケープシーケンス

「\ (バックスラッシュ)」(日本語環境では円記号)には、いくつかの使用法があります。ひとつめの使用法は、非英数字の前に記述する場合で、続く文字が表す特別な意味を取り去ります。 このエスケープ文字としての使用法は、「 [ ] (角括弧の文字クラス)」の内外部いずれでも可能です。

例えば、特殊な意味を持つメタ文字 "*" 文字とマッチさせたい場合は、正規表現(パターン文字列)を "\*" と記述します。いかなる非英数字に対しても、"\" を付けると、特別な意味が打ち消されその文字自体が表わされることになります。特に、バックスラッシュとマッチさせたい場合は、"\\" と記述します。

\\ \
\" ダブルクオート
\' シングルクオート

\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 の文字、もしくは、後方参照
\040 スペースの別の表記法
\40 上と同じ。ただし、キャプチャ用サブパターンが 40 個未満の場合
\7 常に後方参照
\11 後方参照、または、タブの別記法
\011 常にタブ
\0113 タブの後に文字 “3” が続いたもの
\113 8進コードで 113 の文字 (99 を超える後方参照は存在しないため)
\377 全ビットが 1 である 1 バイト
\81 後方参照、または、ヌル文字の後に 2つの文字 “8” および “1” が続いたもの
\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)
\b 単語境界
\B 非単語境界
\A 検索対象文字列の始端(複数行モードとは独立)
\Z 検索対象文字列の終端、または終端の改行(複数行モードとは独立)
\z 検索対象文字列の終端(複数行モードとは独立)
\G マッチングの開始位置

メタ文字(特殊文字)
POINT

  • メタ文字は 正規表現(パターン文字列)中 で 繰り返し選択肢 などを表現することが出来る特殊文字

メタ文字(meta-character)とは、正規表現(パターン文字列)中で、繰り返し や 選択肢 などを表現することが出来る特殊文字です。メタ文字は、その文字自体を表すことはなく、特別な意味を持っており、その意味として解釈されます。正規表現(パターン文字列)は、このメタ文字によって、多様な表現を作ることが出来ます。

メタ文字には、2種類あります。ひとつは、「 [ ] (角括弧)」外で、正規表現(パターン文字列)中のどこででも使用できる文字です。もうひとつは、 「 [ ] (角括弧)」内で使用できる文字です。

\ エスケープ文字
^ 文字列の先頭
$ 文字列の末尾

. 改行を除く任意の1文字
? 0または1回だけの文字
* 0回以上の連続する文字
+ 1回以上の連続する文字

| OR

[] 文字クラス
() パターングループ

{} 量指定子

\n 改行
\r キャリッジリターン
\t タブ
\d 数字 [0-9]
\D 数字以外 [^0-9]
\w 英数字 [_a-zA-Z0-9]
\W 英数字以外 [^_a-zA-Z0-9]
\s 空白 [ \t \r\f]
\S 空白以外 [^ \t\n\r\f]
\b 単語境界 \w、\Wの間
\B 単語境界以外
\x?? 16進数

サンプルコード

– サンプル Click Here ! –

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<meta name="robots" content="index">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head>
<title>PHP 制御構造 return文</title>
</head>
<body>


<h1>PHP 正規表現</h1>


<h3>「$(ドル)」を使用して正規表現を作成</h3>
<?php
if(ereg('TRYPHP$', 'This site is TRYPHP'))
echo 'true';
else
echo 'false';
?>
<br/><br/>


<h3>ereg()で簡単な文字列をマッチさせる</h3>
<?php
if(ereg('pen', 'This is a pen'))
echo 'TRUE';
else
echo 'FALSE';
?>
<br/><br/>


<h3>ereg()で簡単な文字列をマッチさせる</h3>
<?php
if(ereg('pen', 'This is a book'))
echo 'TRUE';
else
echo 'FALSE';
?>
<br/><br/>


<h3>「\(バックスラッシュ)」を使用して正規表現の特殊文字を普通の文字として扱う</h3>
<?php
if(ereg('1.2 + 1.2', '1.2 + 1.2 = 2.4'))
echo 'TRUE';
else
echo 'FALSE';
?>
<br/><br/>


<h3>「\(バックスラッシュ)」を使用して正規表現の特殊文字を普通の文字として扱う</h3>
<?php
if(ereg('1\.2 \+ 1\.2', '1.2 + 1.2 = 2.4'))
echo 'TRUE';
else
echo 'FALSE';
?>
<br/><br/>


<h3>「\(バックスラッシュ)」を使用して正規表現の特殊文字を普通の文字として扱う</h3>
<?php
if(ereg('\\\\', '\\'))
echo 'TRUE';
else
echo 'FALSE';
?>
<br/><br/>


<h3>「^」を使用して正規表現を作成</h3>
<?php
if(ereg('^This', 'This is a pen'))
echo 'TRUE';
else
echo 'FALSE';
?>
<br/><br/>


<h3>「^」を使用して正規表現を作成</h3>
<?php
if(ereg('^This', 'That is Suzuki\'s pen'))
echo 'TRUE';
else
echo 'FALSE';
?>
<br/><br/>


<h3>「$」を使用して正規表現を作成</h3>
<?php
if(ereg('pen$', 'This is a pen'))
echo 'TRUE';
else
echo 'FALSE';
?>
<br/><br/>


<h3>「$」を使用して正規表現を作成</h3>
<?php
if(ereg('pen$', 'This is a book'))
echo 'TRUE';
else
echo 'FALSE';
?>
<br/><br/>


<h3>「.」を使用して正規表現を作成</h3>
<?php
if(ereg('b.g', 'bug'))
echo 'TRUE';
else
echo 'FALSE';
?>
<br/><br/>


<h3>「.」を使用して正規表現を作成</h3>
<?php
if(ereg('b.g', 'bag'))
echo 'TRUE';
else
echo 'FALSE';
?>
<br/><br/>


<h3>「.」を使用して正規表現を作成</h3>
<?php
if(ereg('b.g', 'dog'))
echo 'TRUE';
else
echo 'FALSE';
?>
<br/><br/>


</body>
</html>

– サンプル Click Here ! –


タグ(=記事関連ワード)

タグ: ,

日付

投稿日:2011年12月6日
最終更新日:2014年02月12日

関連記事

配列関数サンプル

このカテゴリの他のページ

この記事へのコメント

トラックバックurl

http://www.tryphp.net/phpref-regular_expression/trackback/