2006年10月28日

[PHP] mb_ereg()じゃない、preg_match_all()に/uをつけるんだ!

ウノウラボ Unoh Labs: PHPのちょっとしたコツ

 最近のスクリプト言語は機能が多く、基本的な機能はほとんど実装されているので、アルゴリズムをどうこうするより、どの機能を使うか選ぶ方が重要だったりしますね(コーディングの効率的にも)。

 自分にもそういったレベルで気をつけていることがいくつかあります。

-[早起き生活]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の日本語正規表現処理まわりには、まだまだいろいろなトリビアがありそうな気がします。ほかにもあれば、教えてください。
posted by momose at 01:08| Comment(2) | TrackBack(1) | 技術TIPS/まとめ

2006年10月21日

エンタテインメント系目標管理ツール「週末クエスト」を公開しました

 新サービス、エンタテインメント系目標管理ツール「週末クエスト」を公開しました。


20061021wequests.jpg

 基本的なコンセプトは、週末の予定やレジャー計画を「クエスト」と呼んで、それを共有しようというものです。登録されているクエストをリストで管理したり、新しいクエストを投稿したりすることもできます。

仕組み

 こういったサイトでは情報がどれだけたくさん登録されているかも重要そうなので、公開前に179個のクエストを用意しました。もちろんこれからもどんどん追加してゆく予定ですが、いまのところ次のあたりがオススメかもしれません。

壁一面本棚化計画@マンション
http://wequests.jp/quests/230/

秋葉原定点観測
http://wequests.jp/quests/229/

スパ・ラクーア
http://wequests.jp/quests/190/

酷道 険道 死苦超損道
http://wequests.jp/quests/245/

WAVE 「1/24 タチコマ」を作る
http://wequests.jp/quests/231/


 ほかの人にもクエストを投稿してもらえるとうれしいです。


 やぁしかし、開発開始から公開まで3ヶ月近くかかってしまったなぁ。しかも、後半はモチベーションが下がってダラダラと進行。やっぱり、個人でやるプロジェクトは、2ヶ月くらいでリリースするようにしたほうがいいみたいですね。
posted by momose at 17:50| Comment(0) | TrackBack(0) | お知らせ