最近のスクリプト言語は機能が多く、基本的な機能はほとんど実装されているので、アルゴリズムをどうこうするより、どの機能を使うか選ぶ方が重要だったりしますね(コーディングの効率的にも)。
自分にもそういったレベルで気をつけていることがいくつかあります。
-[早起き生活]PHPのパフォーマンスチューニング
-[早起き生活]PHPのパフォーマンスチューニング その2:count()も使い過ぎると重くなる
-[早起き生活]PHPのパフォーマンスチューニング その3:APC投入
あと、最近気づいたTIPSとしては、
日本語を正規表現検索したいときでもereg系の関数を使うのはやめとけ
なんてのもあります。
PHPの組み込み正規表現関数にはPHP独自のereg系とPerl互換のpreg系がありますが、ヘルプに書いてあるとおり、ereg系の関数は出来があんまり良くありません。
注意: Perl 互換の正規表現構文を使用する preg_match() のほうが、多くの場合 ereg() よりも速く動作します。
PHPマニュアル:eregより
なので、できる限りpreg系の関数を使いたいわけですが、検索対象や検索パターンに日本語が含まれているときは、日本語処理に対応したereg系の関数であるmb_ereg系の関数が使われることが多いようです。
しかし、このmb_ereg系の関数もあんまり出来がよろしくなくて、たとえば、次のURLで紹介されているサンプルコードでは、「上」や「一」といった漢字がスルーされてしまいます。
「すべての漢字を取り出す正規表現」をPHPで試す
どうも、mb_ereg系の関数では、UTF-8をうまく扱えないようです。
では、PHPでUTF-8の正規表現を扱うには、正規表現検索処理を自作するか、EUC-JPといった別の文字コードに変換してからmb_ereg系の関数で処理するしかないのでしょうか?
実は、preg系の正規表現にパターン修飾子「u」を指定すると、パターン文字列がUTF-8でエンコードされた文字列として扱われるようになります(古いPHPマニュアルにPCRE_UTF8でパターン文字列がShift-JISエンコードされた文字列として処理されるとか書いてあるのはおそらく間違い)。
PHPマニュアル:パターン修飾子
先ほどの「上」や「一」をスルーしてしまうサンプルを、preg系の関数で書き直すと次のようになるでしょうか。
preg_match_all('/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+|[a-zA-Z0-9]+/u', $strToSplit, $aMatches);
PHPの日本語正規表現処理まわりには、まだまだいろいろなトリビアがありそうな気がします。ほかにもあれば、教えてください。




