PHPリファレンス
UPDATE:2024年11月14日
PHPのPOSIX正規表現
POSIXの正規表現とPCREの正規表現の違い
POINT
- PCREの正規表現関数では、パターンを デリミタ で囲う必要があります。
- PCREの正規表現関数では、大文字小文字を必ず区別します。パターン修飾子 i (PCRE_CASELESS) で大文字小文字両方にマッチする動作を指定出来ます。POSIXの正規表現関数は、大文字小文字を区別しない eregi() 関数があります。
- POSIXの正規表現関数は、いちばん左側にある最も長くマッチするパターンを探します。一方 PCREの正規表現関数では、マッチするパターンが最初に見つかった時点で処理を終了します。マッチするパターンがある場合は結果や処理速度に大きな影響が出る可能性があります。
- POSIX における “文字クラス” の定義は PCRE とは異なります。
POSIXの文字クラス
POINT
- POSIX定義済み文字クラス
POSIX正規表現で予め用意されている文字クラスがあります。
文字クラスの種類
[: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] |
[:alnum:]
1 2 3 4 5 6 7 | <!-- サンプルコード --> <?php if(ereg('[:alnum:]', 'あいうえお0123456789a')) echo 'TRUE'; else echo 'FALSE'; ?> |
結果は
TRUE
となります。
マッチ動作の説明
正規表現は半角数字か半角英字小文字大文字を探します。見つけた時点でマッチを終了して TRUE を返します。
正規表現は半角数字か半角英字小文字大文字を探します。見つけた時点でマッチを終了して TRUE を返します。
[:alpha:]
1 2 3 4 5 6 7 | <!-- サンプルコード --> <?php if(ereg('[:alpha:]', '0123456789 あいうえお a かきくけこ')) echo 'TRUE'; else echo 'FALSE'; ?> |
結果は
TRUE
となります。
マッチ動作の説明
正規表現は半角英字 小文字大文字 を探します。見つけた時点でマッチを終了して TRUE を返します。
正規表現は半角英字 小文字大文字 を探します。見つけた時点でマッチを終了して TRUE を返します。
文字クラスの中の文字をPOSIXの文字クラスで指定[:something:]
文字クラスの中の文字をPOSIXの文字クラスで指定出来ます。
1 2 3 4 5 6 7 | <!-- サンプルコード --> <?php if(ereg('[[:digit:][:upper:]]', 'Her affiliation class is 9A.')) echo 'TRUE'; else echo 'FALSE'; ?> |
結果は
TRUE
となります。
マッチ動作の説明
正規表現は最初に半角数字を探します。半角数字が見つかったら次ぎの文字が半角英字大文字か調べます。半角英字大文字でなかったら再度次ぎの半角数字を探します。半角英字大文字であればマッチを終了して TRUE を返します。
正規表現は最初に半角数字を探します。半角数字が見つかったら次ぎの文字が半角英字大文字か調べます。半角英字大文字でなかったら再度次ぎの半角数字を探します。半角英字大文字であればマッチを終了して TRUE を返します。
POSIX正規表現のアンカー
POINT
- アンカーは文字列内の特定の場所を指定
アンカーは文字列内の特定の場所を指定するために正規表現内で使用する特殊文字です。
^ | 文字列の先頭 | abc def ghi jkl |
$ | 文字列の末尾 | abc def ghi jkl |
[[:<:]] | 単語の先頭 | abc def ghi jkl |
[[:>:]] | 単語の末尾 | abc def ghi jkl |
アンカー「^」
文字列の先頭を意味します。
1 2 3 4 | <!-- サンプルコード --> <?php if(ereg('^Her', 'Her affiliation class is 9A.')) echo 'TRUE'; else echo 'FALSE'; ?> |
結果は
TRUE
となります。
マッチ動作の説明
正規表現は文字列の最初が Her であるか調べます。Her であればマッチを終了して TRUE を返します。
正規表現は文字列の最初が Her であるか調べます。Her であればマッチを終了して TRUE を返します。
アンカー「$」
文字列の末尾を意味します。
1 2 3 4 | <!-- サンプルコード --> <?php if(ereg('9A\.$', 'Her affiliation class is 9A.')) echo 'TRUE'; else echo 'FALSE'; ?> |
結果は
TRUE
となります。
マッチ動作の説明
正規表現は文字列の最後が 9A. であるか調べます。9A. であればマッチを終了して TRUE を返します。
正規表現は文字列の最後が 9A. であるか調べます。9A. であればマッチを終了して TRUE を返します。
アンカー「[[:<:]]」「[[:>:]]」
「[[:<:]]」は単語の先頭を意味します。「[[:>:]]」は単語の最後を意味します。
1 2 3 4 5 6 7 8 | <!-- サンプルコード --> <?php if(ereg('[[:<:]]class[[:>:]]', 'Her affiliation class is 9A.')) echo 'TRUE'; else echo 'FALSE'; echo '<br>'; if(ereg('[[:<:]]ati[[:>:]]', 'Her affiliation class is 9A.')) echo 'TRUE'; else echo 'FALSE'; echo '<br>'; if(ereg('ati', 'Her affiliation class is 9A.')) echo 'TRUE'; else echo 'FALSE'; ?> |
結果は
TRUE
FALSE
TRUE
FALSE
TRUE
となります。
POSIX正規表現の関数
POINT
- POSIX正規表現の関数は「マッチング ereg()」「置換 ereg_replace()」「分割 split()」の3種類
POSIX正規表現の関数は「マッチング ereg()」「置換 ereg_replace()」「分割 split()」の3種類があります。
ereg() 関数
正規表現パターンと文字列をマッチします。
以下の例では、
1 2 3 4 | <!-- サンプルコード --> <?php if(ereg('is', 'Her affiliation class is 9A.')) echo 'TRUE'; else echo 'FALSE'; ?> |
結果は
TRUE
となります。
マッチ動作の説明
正規表現は最初に i を探します。 i が見つかれば次の文字が s であるか調べます。 s でなければ再度次の i を探します。s であれば正規表現はマッチ処理を完了してTREUを返します。
正規表現は最初に i を探します。 i が見つかれば次の文字が s であるか調べます。 s でなければ再度次の i を探します。s であれば正規表現はマッチ処理を完了してTREUを返します。
以下の例では、
1 2 3 4 5 | <!-- サンプルコード --> <?php if(ereg('a(.*)n[[:>:]]', 'Her affiliation class is 9A.', $a)) echo 'TRUE'; else echo 'FALSE'; var_dump($a); ?> |
結果は
TRUE
array(2) { [0]=> string(11) “affiliation” [1]=> string(9) “ffiliatio” }
array(2) { [0]=> string(11) “affiliation” [1]=> string(9) “ffiliatio” }
となります。
マッチ動作の説明
正規表現は最初に a を探します。 a が見つかれば次の文字が 任意の文字が0回以上であるか調べます。 そして次の文字が n であるか調べます。n であれば n が単語の終わりであるか調へます。単語の終わりであれば正規表現はマッチ処理を完了してTREUを返します。
正規表現は最初に a を探します。 a が見つかれば次の文字が 任意の文字が0回以上であるか調べます。 そして次の文字が n であるか調べます。n であれば n が単語の終わりであるか調へます。単語の終わりであれば正規表現はマッチ処理を完了してTREUを返します。
ereg_replace() 関数
正規表現パターンと置換文字列と検索対象の文字列を指定します。パターンにマッチした部分を置換文字列に置き換えた文字列を返します。
eregi_replace()関数は大文字小文字を区別しません。その他はereg_replace()関数と同じ働きをします。
1 2 3 4 5 6 | <!-- サンプルコード --> <?php $string = 'His name is Bob'; $string = ereg_replace('Bob', 'Tom', $string); echo $string; ?> |
結果は
His name is Tom
となります。
split() 関数
正規表現パターンにマッチした部分で文字列を分割して配列として返します。オプションで分割数を指定できます。
1 2 3 4 5 | <!-- サンプルコード --> <?php $array = split(',', '1,2,3,4,5,6'); print_r($array); ?> |
結果は
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 )
となります。
エスケープシーケンス
\\ \
\n 改行
\t 水平タブ
\a ベル
\b バックスペース
\r キャリッジリターン
\v 垂直タブコード
\e エスケープコード
\z エンドオブファイル(EOF)
\" ダブルクオート
\' シングルクオート
\n 改行
\t 水平タブ
\a ベル
\b バックスペース
\r キャリッジリターン
\v 垂直タブコード
\e エスケープコード
\z エンドオブファイル(EOF)
\" ダブルクオート
\' シングルクオート
メタ文字(特殊文字)
. 改行を除く任意の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進数
* 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進数
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | <!-- サンプルコード --> <!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> |
タグ(=記事関連ワード)
日付
公開日:2014年2月5日
最終更新日:2024年11月14日
最終更新日:2024年11月14日
このカテゴリの他のページ
この記事へのコメント
トラックバックurl
https://wepicks.net/phpref-regular_expression_posi/trackback/