プログラミングをする上で避けて通ることの出来ないものの一つに正規表現というものがある。
というのはちょっと言い過ぎで、避けて通っても支障がないこともあるのだが、知っていると知らないとでは雲泥の差がでることも多いので知っておいたほうがなにかと楽になる。
正規表現とは何なのかということに関してはウィキペディア[正規表現]に任せるとして、簡単に言ってしまえば文字の集まりを別の形で表現する方法のことで、一つの文章のなかから特定の言葉を探しだしたり、あるいはその探しだした言葉を別の言葉で置換えたりすることに使う事が多い。
例えば、こんな感じのカンマで句切られた文字があったとする。
ビッグ・タイム,辺境の惑星,時は乱れて,ノヴァ急報,レベル・セブン,万華鏡,カインの市
これを
ビッグ・タイム 辺境の惑星 時は乱れて ノヴァ急報 レベル・セブン 万華鏡 カインの市
こんなふうにしたい時、メモ帳とかでマウスを動かしつつEntrtキーとDeleleキーを延々と押し続ければできるけれども、これが数千個もの単語だったとしたら途方に暮れてしまう。
そんな時、カンマを改行に置き換えることができれば事は一瞬で済んでしまう。それが正規表現の使い方のひとつで、プログラムを書くことを生業としている人だけでなくパソコンを使ってデータ操作している人にも便利な事柄だ。
そういうわけで、プログラムを書いている時でも、入力されたデータの中に含まれる文字のなかから特定の文字が存在しているかどうかをチェックするような処理を書かなければならない時、この正規表現を使うといろいろと楽になる。
正規表現というのはある種のパズル性というのがあって、うまくいったときには難しいパズルを解くことが出来たときと同じ快感がある。しかし、これが曲者で、正規表現を使わなくても出来てしまうことですら正規表現を使ってみたりと正規表現に取り憑かれてしまうことも時々あるのだ。
同時に、正規表現は万能ではないので、正規表現だけではできないことも無理してやってしまおうとして無駄な時間を費やしてしまったり、自分の技術の至らなさを自覚せずに、難解な正規表現に挑んでこれまた無駄な時間を費やしてしまうこともある。
こういうときに便利な関数がPHPには存在していて、それがpreg_replace_callbackという関数だ。
通常はpreg_replace関数を使うのだが、preg_replace関数が
preg_replace(検索を行うパターン,置換を行う文字列,対象となる文字列)
であるのに対して、
preg_replace_callback(検索を行うパターン,コールバック関数,対象となる文字列)
となる。つまり、置換えを行う部分を関数として書くことができるのだ。
置き換えの部分を関数として書くことができるということはつまり、検索を行うパターンが不完全で、余分な文字まで対象としてしまう場合でも、関数の中でその余分な文字は除外するという判断条件を書くことができるので結果として正しい結果を出すことができるのである。
preg_replace_callback("/([\d]*)/",'rep_func','abcdefg-0123456')
と書いたとしよう。
‘abcdefg-0123456’という文字列から数字だけ別の文字に置き換えるということを行なっている。\dは10進数を意味している。
ただし、ここで、数字の0だけは置換えたくなかった場合、rep_funcという関数の中で
function rep_func($match){ if ($match[0] != "0") { return "*"; } else { return "0"; } }
とすれば、0は置換えが発生しないので結果としてabcdefg-0******という値を得ることができる。
例題はものすごく単純化しているのでこの程度であればpreg_replace_callback関数など使わなくてもできるのだが、完全に一致させる式を延々と悩み続けて考えるくらいならばあっさりとあきらめてこの方法で処理させてしまう方が手っ取り早いこともある。
何事もあまりこだわらないほうが楽なのだ。
コメント