dポイントプレゼントキャンペーン実施中!

以下のように英数字を小文字から大文字に変換し、
その後、パターンマッチさせるように記述し、
$nameをテニスコートてみてもマッチしませんでした。
たぶん\Qテニスコート\Eの\Q~\Eが問題なのだとは思うのですが
\Q~\Eがないとエラーとなってしまうため、外せません。
このような場合、どうしたらいいのでしょうか?

$name = uc $name;

if($name =~ /\Qテニスコート\E|TENNIS/){
push(@error, 'テニス関係は入力できません');
}

A 回答 (3件)

Shift_JIS コードを使っている場合、パターンマッチ以前の問題として、日本語文字列に uc を適用するとその時点で文字化けの可能性があります。



$name = "テニスコート";
$name = uc $name;
print "$name\n"; # ウカスコーエ

元の文字列を大文字化せずに正規表現に /i フラグを付ける対応策があるのですが、この場合も正規表現に日本語文字列が含まれていると問題があります。日本語文字は2種類の文字にマッチしてしまうものが多数あります。"テニスコート" の例では "ー" 以外の文字が2種類の文字にマッチするので、32 (2 の 5 乗) 種類の文字列とマッチすることになります。

対応策としては、"テニスコート" は index で、"TENNIS" は正規表現の /i フラグで処理するのがいいと思います。


if (index($name, "テニスコート") >= 0 or $name =~ /TENNIS/i) {
push(@error, 'テニス関係は入力できません');
}
    • good
    • 0
この回答へのお礼

具体的に説明してくださり、ご親切にありがとうございますm(_ _)m
/iで実験してみたのですが、kumozさんご指摘の通り、
関係ない日本語にもマッチしてしまい、どうするべきか考えていた次第です。
とても参考になりました。この方法で対応させていただきます!!!

お礼日時:2012/12/14 09:01

それだけなら「大文字・小文字の区別を無視してマッチ」させればいいだけ. わざわざ大文字に直す必要はない.



そして本題については #1 にも書いたけどほぼ間違いなく文字コードがらみなので, 使ってる文字コードだったり use などによる文字コードの指定などを見直すこと.
    • good
    • 0
この回答へのお礼

二度もどうもありがとうございます。
/iでマッチさせる方法を知っていたにもかかわらず
思いつきもしなかった自分の力量のなさを痛感しました。
文字コード見直ししたいところですが、
かなり複雑に見直しが必要なのでどうにかならないか考えていました。
ほんとありがとうございました!!

お礼日時:2012/12/14 08:59

文字コードがらみで何かすりゃいいんじゃない?



なんでわざわざ大文字に直さにゃならんのかがさっぱり理解できんのだけど.

この回答への補足

$nameで入力されるものに例えば「Tennis」「TeNNis」などという制限回避のための
入力があった時でも一度、英字を大文字に整えて禁止ワードがないからチェックいれるためです。

補足日時:2012/12/13 07:28
    • good
    • 0

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