Top > PHP > 正規表現・置換
PHP 基礎編9 - 正規表現、マッチ、置き換え、ereg、eregi、eregi_replace

正規表現

 ・PHP では、ereg で文字列の検索や置き換えを行う。
   (パターンマッチ、パターンマッチング)
   大文字小文字の区別をしない場合は、eregi を使用する。
   また、文字列を置き換える場合は、ereg_replace を使用する。
   大文字小文字の区別をしない置き換えは、eregi_replace を使用する。
 $rcd = ereg(マッチパターン, 対象変数 [, 代入配列]);
 |_ True  一致(マッチ数)
    False 不一致
 $rcd = eregi(マッチパターン, 対象変数 [, 代入配列]);
 |_ True  一致(マッチ数)
    False 不一致
 $rcd = ereg_replace(マッチパターン, 置換文字列, 対象変数);
 |_ True  一致(マッチ数)
    False 不一致
 $rcd = eregi_replace(マッチパターン, 置換文字列, 対象変数);
 |_ True  一致(マッチ数)
    False 不一致

■日本語正規表現

 $rcd = mbereg(マッチパターン, 対象変数 [, 代入配列]);
 $rcd = mberegi(マッチパターン, 対象変数 [, 代入配列]);
 $rcd = mbereg_replace(マッチパターン, 置換文字列, 対象変数);
 $rcd = mberegi_replace(マッチパターン, 置換文字列, 対象変数);

■メタ文字

 .     改行を除く任意の 1 文字
 *     0 回以上のパターン繰り返し
 +     1 回以上のパターン繰り返し
 ?     0 または 1 回のパターン
 ^     先頭から
 $     末尾から
 \     メタ文字クォート
 |     パターン論理和
 ()    パターングループ
 []    文字クラス
 {}    量指定子
 以下の、\s、\S、\f は PHP では使用できないとのこと。
 正しい、制御コードは、
   \x09  \t   水平タブ (Horizontal Tabulation)
   \x0a  \n   改行 (Line Feed)
   \x0b       垂直タブ (Vertical Tablation)
   \x0c       書式送り (From Feed)
   \x0d  \r   復帰 (Carrige Return)
   \x20  " "  間隔 (Space)
 との情報を頂戴した。
 Perl の構文を基本に一部しか実際にテストしていないので他にも PHP では
 違いがあるかもしれません。(^^;

\n 改行 文字クラスでも指定可

 \r    キャリッジリターン            文字クラスでも指定可

\f ラインフィード 文字クラスでも指定可

 \t    タブ                          文字クラスでも指定可
 \d    数字 [0-9]                    文字クラスでも指定可
 \D    数字以外 [^0-9]
 \w    英数字単語 [_a-zA-Z0-9]       文字クラスでも指定可
 \W    英数字単語以外 [^_a-zA-Z0-9]

\s 空白 [ \t\n\r\f] 文字クラスでも指定可

\S 空白以外 [^ \t\n\r\f]

 \b    単語境界 \w、\W の間          文字クラスでも指定可
 \B    単語境界以外
 \x??  16 進数
 「**」部分は Perl と相違があるようなので注意。
 ereg 関数群のホワイトスペースのマッチには、以下を使用するとのこと。
 [[:blank:]]  空白文字にマッチする。[ \t] と等価
 [[:space:]]  全てのホワイトスペースにマッチする。[ \t\n\x0b\x0c\r] と等価

■文字クラス

 -     範囲
 ^     先頭に置くと以外にマッチ
 [0123456789]          数字にマッチ
 [0-9]                 数字にマッチ
 [^0-9]                数字以外にマッチ
 [a-zA-Z]              英字にマッチ
 [a-fA-F\d]            16 進数にマッチ

■量指定子

 {}?   最短マッチ(? がないと最長マッチになる)
 *                     0 回以上のパターン繰り返し
 +                     1 回以上のパターン繰り返し
 ?                     0 または 1 回のパターン
 {n}?                  n 回繰り返しマッチ
 {n,}?                 n 回以上繰り返しマッチ
 {n, m}?               n 回以上、m 回以下繰り返しマッチ

■検索例

 $rcd = ereg("abc", $var);              abc にマッチ
 $rcd = ereg("a.c", $var);              a?c にマッチ
 $rcd = ereg("a(bb|b1|b2)c", $var);     abbc、ab1c、ab2c にマッチ
 $rcd = ereg("^abc", $var);             abc で始まるとマッチ
 $rcd = ereg("abc$", $var);             abc で終わるとマッチ
 $rcd = ereg("^$", $var);               空行とマッチ
 $rcd = ereg("ab?c", $var);             ac、abc にマッチ
 $rcd = ereg("a.*c", $var);             ac、abc、ab1c などにマッチ
 $rcd = ereg("a.+c", $var);             abc、ab1c などにマッチ
 $rcd = ereg("[0-9]{1, 2}", $var);      0 ~ 99 にマッチ
 $rcd = ereg("[a-zA-Z]{8,}", $var);     英字 8 文字以上にマッチ
 $rcd = ereg("あいうえお{2}", $var);    「あいうえおお」にマッチ
 $rcd = ereg("(あいうえお){2}", $var);  「あいうえおあいうえお」にマッチ

■置換例

 $rcd = ereg_replace("abc", "123", $var);        abc を 123 に
 $rcd = ereg_replace("<", "&lt;", $var);      < を &lt; に
 $rcd = ereg_replace("abc", "", $var);           abc を削除(指定文字を取り除く)
 $rcd = ereg_replace("\@", "", $var);            @ マークを削除

PHP正規表現を読みやすくする方法。

通常、PHP正規表現を記述するとき、次のようにpreg_matchに直接渡して使う行うことが多いかと思います。

preg_match("/^[a-z]+$/", $str);

正規表現の内容が複雑になるにつれ、コードがよく分からなくなることはありがちですね。
そこで、次のようにコードを記述すると単位ごとにコメントが付けられて読みやすくなります。

$regex =
'/(w+s+)'. // Word followed by spaces
'{6}'. // Repeated six times
'w+'. // Last word
'/';

更に、次のように正規表現の内容を変数に分かりやすくすれば、もっと分かりやすく記述することが出来そう。

$word = "w+";
$spaces = "s+";
$regex =
"/($word$spaces)". // Word followed by spaces
'{6}'. // Repeated six times
"$word". // Last word
'/';

このように工夫次第で正規表現はもっと分かりやすく記述できそうです。

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/php_k09.htm

コメントを書き込むためには、Hatena で認証をお願いします。


リロード     ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Sat, 04 Dec 2010 22:49:44 JST (2696d)