正規表現を使用して文字列の検索や置換を行う - PHP5 プログラミング
PROGRAM
正規表現を使用して文字列の検索や置換を行う
PHP5 では、正規表現という書式を使用して、高度な文字列の検索や置換を行うことができるようになっています。
正規表現の書式についてはインターネット上を探せば詳細な解説が得られますので、ここでは PHP5 で正規表現による文字列操作を行うに当たっての基本的な事項についてをまとめてみたいと思います。
パターンマッチ(検索)
ある文字列 $subject に、正規表現で指定した文字列が存在するかどうかを判定する際には "preg_match" という関数を利用します。
// 例えば、次のような正規表現を用意します。
$pattern = '/KEY=(\w*),VALUE=(\w*)/';
// 正規表現 $pattern にマッチする文字列であるかを調べます。
if (preg_match($pattern, $subject))
{
// 一致していた場合の処理です。
}
preg_match は、正規表現がマッチすると 1 を返し、マッチしなければ 0 を返します。処理中にエラーが発生した場合には false を返すとのことでした。
また、正規表現では "(" ")" を使用して指定した正規表現の内の特定の箇所にマッチした文字列を取得する機能も備えていますが、そのようにしてマッチングと併せて値を取得したい場合には、preg_match の 3 つ目の引数でそれを受け取ることができるようになっています。
// 正規表現 $pattern にマッチする文字列であるかを調べ、マッチした文字列を $matches に配列として取得します。
preg_match($pattern, $subject, $matches)
このようにすることで、正規表現 $pattern にマッチした場合、引数 $matches には配列として、$matches[0] にマッチした全体の文字列が、引き続き $matches[1] から先は正規表現のカッコで括った部分とマッチした文字列が順次格納されて行きます。
置換
ある文字列 $subject の、正規表現 $pattern に一致した部分を別の文字列に置き換えたい場合には "preg_replace" という関数を使用します。
// 文字列 $subject の正規表現 $pattern にマッチする部分を $replace に置き換えます。
$result = preg_replace($pattern, $replace, $subject);
preg_replace 関数は、置き換えた後の文字列を戻り値として返します。
なお、$replace で指定する置き換え文字列には、$0 から $99 までの文字列を含めることで、$0 ならマッチした全体の文字列に、$1 や $2 なら正規表現のカッコで括った部分とマッチした文字列に、置き換えて置換することが可能です。
変数の値をパターン内で指定する
正規表現では "\" や "." 等といった、特別な意味合いを持つ記号がいくつかあります。
preg_match や preg_replace を行う際に、これらの文字が含まれる文字列変数をそのまま指定してしまうと、特別な意味合いを持った記号としてそれが扱われてしまいます。
例えば、ファイル名 "test.txt" という名前が保存された変数 $filename があったとして、それを正規表現のパターンとして使用してしまうと、ファイル名と拡張子との間のドットが "任意の 1 文字" を示す正規表現として扱われてしまうため、そのままでは "testttxt" や "test-txt" 等ともマッチしてしまうことになります。
ある文字列に含まれる内容に特別な意味合いを持たせたくない場合は、次のようにすることで、特別な意味合いを持つ記号を打ち消した正規表現を取得することが可能です。
$pattern = preg_quote($filename, '/');
これにより、$filename 変数に含まれる正規表現の特別な意味を持つ記号をエスケープして無効化された文字列を取得することができました。
このときの第二引数 '/' ですが、これは正規表現のパターンを指定する際にその全体の前後に付加させた文字です。
今回の例でも "/KEY=(\w*),VALUE=(\w*)/" というように、正規表現のパターンの最初と最後に "/" を付けて表現をしていましたが、この文字をパターン内で使用する場合には \ によりエスケープする必要があります。
この文字はプログラマーが任意で付けることができるため、preg_quote でエスケープする場合には、その文字を明示して preg_quote を呼び出す必要があります。
そうしないと、変数の中でその文字が使用されていた場合に、その文字だけエスケープされずに残ってしまうので注意が必要です。
[ もどる ]