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

9-3 PHPのPOSIX正規表現

Pocket

説明

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:]
if(ereg('[:alnum:]', 'あいうえお0123456789a'))
echo 'TRUE';
else
echo 'FALSE';

結果は

TRUE

となります。

マッチ動作の説明
正規表現は半角数字か半角英字小文字大文字を探します。見つけた時点でマッチを終了して TRUE を返します。

[:alpha:]
if(ereg('[:alpha:]', '0123456789 あいうえお a かきくけこ'))
echo 'TRUE';
else
echo 'FALSE';

結果は

TRUE

となります。

マッチ動作の説明
正規表現は半角英字 小文字大文字 を探します。見つけた時点でマッチを終了して TRUE を返します。

文字クラスの中の文字をPOSIXの文字クラスで指定[:something:]

文字クラスの中の文字をPOSIXの文字クラスで指定出来ます。

if(ereg('[[:digit:][:upper:]]', 'Her affiliation class is 9A.'))
echo 'TRUE';
else
echo 'FALSE';

結果は

TRUE

となります。

マッチ動作の説明
正規表現は最初に半角数字を探します。半角数字が見つかったら次ぎの文字が半角英字大文字か調べます。半角英字大文字でなかったら再度次ぎの半角数字を探します。半角英字大文字であればマッチを終了して TRUE を返します。

POSIX正規表現のアンカー
POINT
  • アンカーは文字列内の特定の場所を指定

アンカーは文字列内の特定の場所を指定するために正規表現内で使用する特殊文字です。

^ 文字列の先頭 abc def ghi jkl
$ 文字列の末尾 abc def ghi jkl
[[:<:]] 単語の先頭 abc def ghi jkl
[[:>:]] 単語の末尾 abc def ghi jkl

アンカー「^」
文字列の先頭を意味します。

if(ereg('^Her', 'Her affiliation class is 9A.')) echo 'TRUE'; else echo 'FALSE';

結果は

TRUE

となります。

マッチ動作の説明
正規表現は文字列の最初が Her であるか調べます。Her であればマッチを終了して TRUE を返します。

アンカー「$」

文字列の末尾を意味します。

if(ereg('9A\.$', 'Her affiliation class is 9A.')) echo 'TRUE'; else echo 'FALSE';

結果は

TRUE

となります。

マッチ動作の説明
正規表現は文字列の最後が 9A. であるか調べます。9A. であればマッチを終了して TRUE を返します。

アンカー「[[:<:]]」「[[:>:]]」
「[[:<:]]」は単語の先頭を意味します。「[[:>:]]」は単語の最後を意味します。

if(ereg('[[:<:&#93;&#93;class&#91;&#91;:>:]]', 'Her affiliation class is 9A.')) echo 'TRUE'; else echo 'FALSE';
echo '<br/>';
if(ereg('[[:<:&#93;&#93;ati&#91;&#91;:>:]]', '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

となります。

POSIX正規表現の関数
POINT
  • POSIX正規表現の関数は「マッチング ereg()」「置換 ereg_replace()」「分割 split()」の3種類

POSIX正規表現の関数は「マッチング ereg()」「置換 ereg_replace()」「分割 split()」の3種類があります。

ereg() 関数
正規表現パターンと文字列をマッチします。

以下の例では、

if(ereg('is', 'Her affiliation class is 9A.')) echo 'TRUE'; else echo 'FALSE';

結果は

TRUE

となります。

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

以下の例では、

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” }

となります。

マッチ動作の説明
正規表現は最初に a を探します。 a が見つかれば次の文字が 任意の文字が0回以上であるか調べます。 そして次の文字が n であるか調べます。n であれば n が単語の終わりであるか調へます。単語の終わりであれば正規表現はマッチ処理を完了してTREUを返します。

ereg_replace() 関数
正規表現パターンと置換文字列と検索対象の文字列を指定します。パターンにマッチした部分を置換文字列に置き換えた文字列を返します。

eregi_replace()関数は大文字小文字を区別しません。その他はereg_replace()関数と同じ働きをします。

$string = 'His name is Bob';
$string = ereg_replace('Bob', 'Tom', $string);
echo $string;

結果は

His name is Tom

となります。

split() 関数
正規表現パターンにマッチした部分で文字列を分割して配列として返します。オプションで分割数を指定できます。

$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)
\” ダブルクオート
\’ シングルクオート

メタ文字(特殊文字)
. 改行を除く任意の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進数

サンプルコード
<!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日
最終更新日:2014年02月08日

関連記事

配列関数サンプル

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

この記事へのコメント

トラックバックurl

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