[PHP-users 12321] Re: PHPによる全角判定

Osamu Shigematsu php-users@php.gr.jp
Tue, 24 Dec 2002 13:27:34 +0900


重松です。こんにちは。

> >文字種類は無視して、全角文字か半角文字かを判定するだけなら、
> >これでもいいかと思っていたのですが。。
> >問題アリ!と思われる方は、ぜひご指摘ください。
> 
> 僕もこの方法を一番に思い付きました。
> ただマニュアルの↓このページに書いてある通り
> 
> http://www.php.net/manual/ja/ref.mbstring.php
> >マルチバイト対応版関数による既存関数のオーバーロード
> 
> サーバーの設定次第で
> strlen() が mb_strlen() をオーバーロードするそうです。
> そのあたりを注意すれば考え方も簡単なのでいいんじゃないでしょうか?

問題点というわけではないですが、パフォーマンスを考えれば、
ものすごく無駄な処理だと思います。

strlen() の実装はどうなっているか知りませんが、百歩譲って、
内部に文字列の長さを保持してそれを返すので、オーバヘッドが
ほとんどないとしても、mb_strlen() だと、そうも行きません。

なので、結局は、たとえ、多少のオーバヘッドがあるとしても、
(正規表現を parse して NFA/DFA を構築する時間)
スクリプトレベルの for() でまわすよりは速いと思うので、
正規表現で、0x80-- を引っ掛ければ、引っかかった時点で、
処理を終了できるので、高速だと思います。
PHP では、UFT-16 は扱わないように思うので、これで問題ない気がします。

正規表現については、他の方がすでにアイデアとして出されてますね。

けど、大本の質問をされた方が、何を考えているのかがわかりませんけど、
よくあるわたしは「最低」と思うインタフェイスに、
住所などで「数字を全角で入力してください」、だとか、
「振り仮名はカタカナで入力してください」ってのがあります。
それくらい、そっちで変換しろよ、と思うのは私だけですかね?

そういう次元の問題なら、変換すればいいし、電話番号などで、
半角数字だけで構成されていることを期待するなら、
やっぱり正規表現でしょうし。

-- 
Osamu Shigematsu <m5issige@mr.hitachi-medical.co.jp>