PHP研究

14.正規表現

これまでにもなんとなく正規表現の関数が出てきたけど、ここでまとめて見たいと思います。
PHP独自のPOSIX1003.2 で定義されたPOSIX 拡張正規表現関数と、
Perl互換の関数があるようです。


正規表現でマッチさせる
ereg("正規表現",$str[, $array])

$strにある文字列に正規表現をマッチさせます。
$arrayはオプションで、マッチした文字列を配列として格納します。


if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)) {


大文字小文字を区別せずマッチング
eregi("正規表現", $str[, $array])

ereg()と同様の書式ですが、大文字小文字を区別しません。


if (eregi("z", $string)) {


置換
ereg_replace("マッチさせる正規表現","置き換える文字列",$str)


echo ereg_replace (" is", " was", $string);


大文字小文字を区別せず置換
eregi_replace("マッチさせる正規表現","置き換える文字列",$str)


正規表現検索
preg_match("正規表現",$str[,$array])

Perl互換の正規表現関数です。


if (preg_match ("/php/i", "PHP is the web scripting language of choice.")) {


日本語対応正規表現(PHP4.2.0以降)
mb_regex_encoding("SJIS") ;//内部エンコーディングと違う文字コードの場合に指定
mb_ereg("正規表現",$str[, $array]);


大文字小文字を区別しない日本語対応正規表現(PHP4.2.0以降)
mb_regex_encoding("SJIS") ;//内部エンコーディングと違う文字コードの場合に指定
mb_eregi("正規表現",$str[, $array]);

上記2つの日本語対応正規表現は、まだ実験段階とのこと。
テストスクリプトを作ってみたけど、このサーバでは動かなかった。



PHP Perl 意味
[= =]   [=と=]の間にあるキャラクタと“等価”なキャラクタにマッチ
[: :]   キャラクータクラス指定
[:alnum:] アルファベットと(十進)数字
[:alpha:] アルファベット
[:blank:] 空白文字(スペース、タブ等)
[:cntrl:] 制御文字
[:digit:] 十進数字
[:graph:] 印字可能かつ表示可能な文字(スペースは印字可能だが表示可能ではない)
[:lower:] アルファベットの小文字
[:print:] 印字可能なキャラクタ(=制御文字以外のキャラクタ)
[:punct:] 句読点(通常の文字、数字、制御文字、スペースのいずれでもないキャラクター)
[:space:] スペース、タブ、改ページ
[:upper:] アルファベットの大文字
[:xdigit:] 十六進数字
  \w アルファベット、数字又は下線
  \W アルファベット、数字、下線以外
  \d 数字
  \D 数字以外[^0-9]と同じ
  \s 空白文字(スペース、タブ、改行)
  \S 空白文字以外
  \n 改行
  \r リターン(復帰)
  \t タブ
  \d バックスペース
  12 8進数の値
  \x811 16進数の値
  \cx 制御文字
[. .]   [.と.]に挟まれたキャラクタ列を一つの照合要素とみなす
[a-z0-9] [a-z0-9] [ ]の中の任意の1文字
[^a-z0-9] [^a-z0-9] [ ]の中にない任意の1文字
( ) ( ) グループ化
* * 直前の文字が0個以上
+ + 直前の文字が1個以上
? ? 直前の文字が0個または1個
  {a} 直前の文字がa個
  {a,} 直前の文字がa個以上
{a,b} {a,b} 直前の文字がa個以上b個以下
  ?? 直前の文字が0個または1個(最短一致)
  *? 直前の文字が0個以上(最短一致)
  +? 直前の文字が1個以上(最短一致)
  {a}? 直前の文字がa個 (最短一致)
  {a,}? 直前の文字がa個以上 (最短一致)
  {a,b}? 直前の文字がa個以上b個以下 (最短一致)
^ ^ 行頭
$ $ 行末
| |

演算子の左右に置かれた部分正規表現のいずれか

. . 改行文字を除く任意の1文字
  \b 単語の区切り
  \B 単語の区切り以外
  \ 次のメタ文字をクォートする ( \. → "."自信を表わす)
  $1.$2, \1.\2 グループ化した項目を後で参照する
  $& マッチした文字列全体
  $` マッチした文字列の前にある全ての文字列
  $' マッチした文字列の後ろにある全ての文字列