|
4.10 正規表現
■正規表現とは
正規表現は文字の組み合わせを定義したパターンを使用し、そのパターンに適合(マッチ)する文字列を検索したり、置換したりするのに使います。
■PHPで利用できる正規表現
PHPには2種類の正規表現が用意されています。一つは、POSIX準拠の正規表現です。IEEEによって規定されたUNIX系OSの基本的な仕様です。
もう一つはPerlに準拠した正規表現です。ここでは、より高機能なPerl互換の正規表現について扱います。
■正規表現の書式
マッチングに使用するパターン文字列は次の書式で記述します。
/パターン文字列/パターン修飾子
「/」はデリミタと呼ばれ、パターン文字列の先頭と末尾につけられる。一般に「/」(スラッシュ」が使用される。
パターン修飾子はオプションです。
■文字(リテラル)
文字列そのものもパターンに記述することができます。大文字と小文字は区別されます。サンプルをリスト4.46に示します。アクセス結果を図4.48に示します。
リスト4.46 preg_literal.php
<html>
<head>
<title>preg_literal.php</title>
</head>
<body>
<?php
// 文字(リテラル)
$arr_str = array ( 'abc', '123abc','123abc456','ABC','123ABC','bcd'
);
foreach ( $arr_str as $str ) {
if ( preg_match( "/abc/", $str ) ) { //
文字列パターン/abc/の検索
print "$str<br>"; //
一致した場合に出力
}
}
?>
</body>
</html>
図4.48
■メタ文字
メタ文字は、文字の繰り返しや選択などなど特殊な書式を指定するために使用します。
■任意の文字「.」
「.」(ピリオド)はメタ文字として使用した場合、改行以外の任意の1文字をあらわします。サンプルをリスト4.47に示します。アクセス結果を図4.49に示します。
リスト4.47 preg_meta_any.php
<html>
<head>
<title>preg_meta_any.php</title>
</head>
<body>
<?php
// メタ文字:「.」任意の文字
$arr_str = array ( 'abc', '123abc','123abc456','ABC','123ABC','bcd'
);
foreach ( $arr_str as $str ) {
if ( preg_match( "/abc./", $str ) ) { //
文字列パターン/abc./の検索
print "$str<br>"; //
一致した場合に出力
}
}
?>
</body>
</html>

図4.49
「abc」や「123abc」は一致しないことがわかります。
■メタ文字のエスケープ
メタ文字をメタ文字でなく元の文字そのものとして文字パターンに使用する場合はエスケープ文字「\」を使用します。サンプルをリスト4.48に示します。アクセス結果を図4.50に示します。
リスト4.48 preg_meta_escape.php
<html>
<head>
<title>preg_meta_escape.php</title>
</head>
<body>
<?php
// メタ文字:「\」エスケープ文字
$arr_str = array ( 'abc.html', 'ade.html','123.html','abc.htm','abchtml'
);
foreach ( $arr_str as $str ) {
if ( preg_match( "/a..\.html/", $str ) ) { //文字列パターン/a..\.html/の検索
print "$str<br>"; //
一致した場合に出力
}
}
?>
</body>
</html>

図4.50
■エスケープ文字による特殊文字、文字種の指定
特殊な文字や、文字種を示すためのメタ文字があります。エスケープ文字「\」とメタ文字以外の文字と組み合わせて使用します。たとえば「\d」は数字の文字種を示し0〜9の数字にマッチします。サンプルをリスト4.49に示します。アクセス結果を図4.51に示します。
リスト4.49 preg_meta_special.php
<html>
<head>
<title>preg_meta_special.php</title>
</head>
<body>
<?php
// メタ文字:「\d」数字
$arr_str = array ( '200', '2000','2001','200x','20000','32000' );
foreach ( $arr_str as $str ) {
if ( preg_match( "/200\d/", $str ) ) { /*
文字列パターン/200\d/の検索 */
print "$str<br>"; //
一致した場合に出力
}
}
?>
</body>
</html>

図4.51
■エスケープ文字による位置条件の指定
文字列の始端、終端や単語の境界などの特定の位置でマッチする条件を指定するためのメタ文字もあります。エスケープ文字「\」とメタ文字以外の文字を組み合わせます。「\A」は対象文字列の先頭、「\Z」は対象文字列の最後の改行文字の直前までを意味します。「\b」は単語の境界を意味します。サンプルをリスト4.50に示します。アクセス結果を図4.52に示します。
リスト4.50 preg_meta_position.php
<html>
<head>
<title>preg_meta_position.php</title>
</head>
<body>
<?php
// メタ文字:「\b」単語境界
$arr_str = array ( 'newspaper', 'news','a new car','new','renew','new_'
);
foreach ( $arr_str as $str ) {
if ( preg_match( "/\bnew\b/", $str ) ) { //文字列パターン/\bnew\b/の検索
print "$str<br>"; //
一致した場合に出力
}
}
?>
</body>
</html>

図4.52
■繰り返し指定のメタ文字
正規表現ではパターンの繰り返しを記述できます。「*」は直前のパターンの0回以上の繰り返しを意味します。サンプルをリスト4.51に示します。アクセス結果を図4.53に示します。
リスト4.51 preg_meta_repeat.php
<html>
<head>
<title>preg_meta_repeat.php</title>
</head>
<body>
<?php
// メタ文字:「*」直前のパターンの0回以上の繰り返し
$arr_str = array ( 'net', 'news','a new car','new','renew','new_' );
foreach ( $arr_str as $str ) {
if ( preg_match( "/new.*/", $str ) ) { //
文字列パターン/new.*/の検索
print "$str<br>"; //
一致した場合に出力
}
}
?>
</body>
</html>
図4.53
■位置指定のメタ文字
「^」は対象文字列の先頭、「$」は対象文字列の終端を意味します。なお、パターン修飾子「m」を追加した場合はm文字列の先頭、終端だけでなく、各行の先頭、終端も意味します。サンプルをリスト4.52に示します。アクセス結果を図4.54に示します。
リスト4.52 preg_meta_position_m.php
<html>
<head>
<title>preg_meta_position_m.php</title>
</head>
<body>
<?php
// メタ文字:「^」,「$」各行の先頭と終端
$arr_str = array ( "123\n456\n", "abc\n45678\n","123\nabc456\n");
foreach ( $arr_str as $str ) {
if ( preg_match( "/^abc$/m", $str ) ) { //
文字列パターン/^abc$/mの検索
print $str . "<br>"; //
一致した場合に出力
}
}
?>
</body>
</html>
図4.54
■文字クラス
文字クラスは、マッチする文字列のグループを定義する機能です。文字クラスの定義はメタ文字「[]」でくくって記述します。また、連続する文字を文字クラスの中で記述する場合は、「-」(ハイフン)を使用します。[a-z]は、すべての英小文字を意味します。サンプルをリスト4.53に示します。アクセス結果を図4.55に示します。
リスト4.53 preg_meta_char_class.php
<html>
<head>
<title>preg_meta_char_class.php</title>
</head>
<body>
<?php
// メタ文字:文字クラス
$arr_str = array ( "123","456xyz", "abc",
"deFG","abc\n");
foreach ( $arr_str as $str ) {
if ( preg_match( "/^[a-z]+$/m", $str ) ) { /*
文字列パターン
/^[a-z]+$/mの検索 */
print $str . "<br>"; //
一致した場合に出力
}
}
?>
</body>
</html>

図4.53
■パターン修飾子
パターン修飾子はマッチングのオプションを指定します。「i」は大文字と小文字の区別をしないように指示します。「m」は複数行モードで処理するよう指示します。サンプルをリスト4.54に示します。アクセス結果を図4.56に示します。
リスト4.54 preg_meta_option.php
<html>
<head>
<title>preg_meta_option.php</title>
</head>
<body>
<?php
// 修飾子
$arr_str = array ( "123","456xyz", "abc",
"deFG","abc\n");
foreach ( $arr_str as $str ) {
if ( preg_match( "/^[a-z]+$/mi", $str ) ) { /*
文字列パターン
/^[a-z]+$/miの検索 */
print $str . "<br>"; //
一致した場合に出力
}
}
?>
</body>
</html>
図4.56
|