プロが教える店舗&オフィスのセキュリティ対策術

利用者の登録スクリプトを作成しているのですが、その利用者の名前を日本語・英字・数字をOKにしており、データファイルに保存しています。
この中には例えば「管理者」「admin」「Admin009」の三つの名前があるとします。
次に新しい利用者が「管理者」という名前を登録しようとしてもNGになるように、既に登録されている名前は登録不可という感じにしています。

$nameが入力フォームの名前欄で、$dataがデータファイルとして、
if($name eq $data){
エラー文
}
などで同じ名前が登録されていたらNGにしています。

同じように「admin」で登録しようとしてもNGになるわけですが、この場合大文字小文字を区別しないようにしたいと思っています。
AdminやADMINなども不可能になるという事です。
その場合正規表現で、

if ($name =~ /$data/i){
エラー文
}
で大丈夫かと思ったのですが、このようにした場合500エラーが発生しました。(これはデータファイルの中に日本語も混ざってるからでしょうか?)

if ($name =~ /^$date/i){
エラー文
}
としたらエラーは出ずに、大文字の「ADMIN」や「adMin」などもNGにしてくれるのですが、「ADMINS」や「adminsss」などの名前も登録できなくなります。
先頭にマッチする「^」がある為、文字列の先頭に「admin」の文字列があるのでNGになると思うのですが、
私の希望では「admin」という同語(大小区別なく)に対してNGを出したくて、adminsは登録可能にしたいというのが希望の動作です。

このような場合、どのような正規表現が適しているか、もしお解かりになられましたらご教示いただけますと幸いです。
よろしくお願い致します。

A 回答 (1件)

末尾に'$'を付ければ良いと思います。


 if($name=~/^$data$/i){
のように。

'^'を付けたらエラーが出なくなったという事ですが、
もしやっていないのなら、日本語の処理はちゃんと
やっておいた方が良いと思います。
perl5.8系なら入力時に'<:encording()'するか、または単にencode()し、
perl5.0系なら一旦eucに変換してから比較する、という感じです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ご提示頂いた方法で希望の動作が実現できました。

日本語の処理ですが、一応やってはいるのですが、恐らくうまくいっていないみたいなので、教えて頂いた方法でまた着手させていただこうと思います。

ご丁寧にご教示頂きましてありがとうございました。

お礼日時:2007/02/21 04:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!