• ベストアンサー

全角ひらがな、漢字をマッチさせたい

Perlでフォームに入力された値をチェックするとき、入力される文字列は半角文字以外を入力されるとエラーになるスクリプトを書きたいと思っています。 (ただし、半角に出来る文字「カタカナ、記号等」は半角に変換するのでエラーでは無いとしたいです) どうすれば実現出来るでしょうか。 よろしくお願いします。

  • pco
  • お礼率44% (8/18)
  • Perl
  • 回答数4
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • sssohei
  • ベストアンサー率33% (33/98)
回答No.1

パターンマッチを利用することをオススメします。 とりあえず、余計なマッチミスを防ぐためにも、EUCコードに変換してから処理を行います。 参考URLのページに詳しく解説されています。 参考URLのページをみても分からなければ、補足をお願いします。 一応、主要な文字コードのパターンを記しておきます。 $nobashi = '(?:\xA1[\xBC\xBD\xC1])'; # ー-~ $kigo = '(?:[\xA1\xA2][\xA1-\xFE])'; # 全角の記号 $suuji = '(?:\xA3[\xB0-\xB9])'; # 0-9 $alphabet = '(?:\xA3[\xC1-\xDA\xE1-\xFA])'; # 全角英字 $alpha_big = '(?:\xA3[\xC1-\xDA])'; # 全角英字(大文字A-Z) $alpha_small = '(?:\xA3[\xE1-\xFA])'; # 全角英字(小文字a-z) $hiragana = '(?:\xA4[\xA1-\xF3])'; # ぁ~ん $katakana = '(?:\xA5[\xA1-\xF6])'; # ァ~ヶ

参考URL:
http://www.din.or.jp/~ohzaki/perl.htm
pco
質問者

補足

回答ありがとうございます。 参考URLを見てやってみたのですがうまくいきません。 カタカナが1文字の時はうまく行くようなのですが、複数のカタカナになった場合、失敗します。 文字コードは全てEUCで行っています。 以下がやろうとしている手順です。 1.全角文字を半角文字へ変換する 2.チェックを行う #1バイト文字以外の時 if($buf !~ /[\x00-\x7F]/){   #半角カタカナ以外のとき   if($buf !~ /(?:\x8E[\xA6-\xDF])/){     print "NG\n";     exit;   } } print "OK\n"; どこがおかしいのでしょうか。 正規表現はまだよく分かっていないためご迷惑をおかけしますがよろしくお願いします。

その他の回答 (3)

  • sssohei
  • ベストアンサー率33% (33/98)
回答No.4

参考URLの「日本語を扱う」の項の「正しくパターンマッチさせる」の部分を読まれたでしょうか? http://www.din.or.jp/~ohzaki/perl.htm#JP_Match 私もこのページにはよくお世話になります(^^; ここに書かれたとおり、文字コードを指定するだけではうまく行かないのです^^; 後、前の書き込み時には忘れていたのですが、 私の書いた全角の記号には半角に変換出来ない記号も含まれます。とりあえず、文字コードを調べられるソフトで変換の対象にしたい文字のコードを調べてください^^; 私は プレジャースカイという会社の フリーソフトhttp://www.pleasuresky.co.jp/ を使わせて頂いてます。 >修飾子 g (処理の対象を全域にする)を使ってください は単に含まれるかを調べる場合、必要ありません。 abc に b というパターンがマッチします。 perl -e "$str='abc'; print 'Match!' if $str =~ /b/;" プロンプトから実行してみてください。 「プロンプト」というのは、ちなみに、Win9X系だと、DOSプロンプト、WinNT系だと、コマンドプロンプトと呼ばれる物です。Linuxだったらターミナル(エミュレータ)です。念のため^^;

参考URL:
http://www.din.or.jp/~ohzaki/perl.htm#JP_Match, http://www.pleasuresky.co.jp/
pco
質問者

お礼

> 参考URLの「日本語を扱う」の項の「正しくパターンマッチさせる」の部分を読まれたでしょうか? 読ませていただきました。 難しいですね。文字の奥の深さが分かります。 少しずつ理解していきたいと思います。 [g]の件もありがとうございました。 これからも質問等するかもしれませんがよろしくお願いします。

pco
質問者

補足

回答ありがとうございます。 下で書いたコードですが間違っていたようです。 みなさんのアドバイスを受けながらいろいろ考えてみたのですがとりあえず、以下のコードでうまく動いているようです。 sub Check{   ($buf) = @_;   #1バイト文字を消す   $buf =~ s/[\x00-\x7F]//g;   #半角カタカナを消す   $buf =~ s/(?:\x8E[\xA6-\xDF])//g;   #まだ文字が残っていればエラーとする   if(length($buf) == 0){     return "OK";   }else{     return "NG";   } } 感覚的にあまりよい回答では無いと思うのですが。 もし、もう少しよい回答があれば教えていただけるとうれしいです。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.3

全角カナと半角カナの並びは違うので、変換しようと思ったらパターンを配列に記述するしかないと思います。 私は逆のこと、つまり半角カナを全角カナに直すとか勉強してました。 $moji = 'ホゲ'; @base = ('ア', 'イ',・・・'ァ'・・・); @change = ('ア', 'イ',・・・'ァ'・・・); #←ホントは半角 for($n = 0; $n < @base; $n++){ $moji =~ s/$base[$n]/$change[$n]/g; } とかやってできると思ったら、大間違いでした! ある文字の2バイト目と次の文字の1バイト目を1文字としてマッチしてしまうのです。 難しいところです。 ほかの方の参考URLなどもみて、お互いがんばって勉強しましょう。 ちなみに、このOKWEBも指摘するように、半角カナは機種依存文字なので使わないほうがいいです。 半角って言ってもEUCでは2バイトだし・・・。

pco
質問者

お礼

回答ありがとうございます。 半角カタカナはWebでは使わない方がいいのは分かっているのですが、プログラムの仕様上どうしても半角カタカナを使用しなければいけないんです。 上に作成してみたコードを書いておきました。 もし、アドバイス等ありましたらよろしくお願いします。

  • ctpsys
  • ベストアンサー率0% (0/2)
回答No.2

修飾子 g (処理の対象を全域にする)を使ってください。 if($buf !~ /(?:\x8E[\xA6-\xDF])/g){ とします。 正規表現には修飾子の他量指定子、位置指定子など、 色々ありますので、一度ネットや本で調べると面白いです。 私も、正規表現では苦労しています。頑張りましょう。

pco
質問者

お礼

回答ありがとうございます。 上の記事に考えてみたコードを書いておきました。 また、おかしいところ等あればアドバイスよろしくお願いします。 正規表現は難しいですね。 でも、面白いものだとも思います。 がんばりたいと思いますでこれからもよろしくお願いします。

関連するQ&A

  • フォーム入力のチェック

    フォームの入力をCGI(Perl)でチェックするとき、 全角の漢字、カタカナ、ひらがなでの入力以外は禁止にしたいです。 どなたかいい方法をご存知でしょうか? とりあえず、現在は、 jcode.plで全角英数字⇒半角英数字に変換 フォームに入力された文字列を一文字(半角2文字)ずつ抽出して、 $a=~ s/([^\w ])/'%' . unpack("H2", $1)/eg; でエンコードしたものが%を含んでいるかどうかで判別してます。 でもこれだと全角英数字と半角英数字しかシャットアウトできません。 記号文字なども入力出来ないようにしたいです。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • 全角漢字の入力チェック

    Javascriptにて、Formのテキストフィールドの内容を入力チェックしているのですが、「全角漢字」「全角かな」「全角カナ」「半角英数字」 のみを許可して、それ以外の入力文字をいれるとエラーになるような 関数を作りたいのですが、全角記号や半角記号をチェックするには どうしたらよいのでしょうか。

  • Perl UTF8 での全角カタカナチェック

    ■環境 Linux, Perl 5.8 です。 画面(HTML)と処理(Perl)は分けて作成しており、Templateモジュールで画面表示を行っています。 HTMLもPerlも文字コードはUTF-8です。 ■質問 フォームからうけとった文字列で全角カタカナと特定の全角記号以外はエラーとする 入力チェック処理(正規表現)がうまくチェックを行ってくれません。 SJISだと以下のような書き方があるそうなのですが、UTF8での書き方がわかりません。 ・SJIS if($data !~ /^(?:\x83[\x40-\x96])+$/){ $mes="全角カナ以外の文字が指定されています"; } UTF8での書き方を教えて頂きたいです。 なお、許容する全角カタカナと特定の全角記号は以下のとおりです。 ========================================================== アイウエオカキクケコサシスセソタチツテトナニヌネノ ハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン ァィゥェォッャュョヵヶヴガギグゲゴザジズゼゾダヂヅデド バビブベボパピプペポーヽヾ ========================================================== ご教授お願い致します。

  • 全角から半角に変換する

    Javaで、文字列の中に全角があれば単純に半角に変換するような処理をしたいです。具体的には、次のような文字列があった場合、以下のように変換したいです。 <変更前> あ亜アアaaAA11%% <変更後> ア亜アアaaAA11%% つまり、以下のようにしたいです ・全角ひらがな→半角カタカナ ・漢字:何もしない ・全角カタカナ→半角カタカナ ・半角カタカナ:何もしない ・半角アルファベット→何もしない ・全角アルファベット→半角アルファベット ・半角数字→何もしない ・全角数字→半角数字 ・半角記号→何もしない ・全角記号→半角記号 上記のように書くと複雑に見えますが、要は基本的に半角に相当する文字がある場合には半角にしたいだけです。Googleで探してみましたが、Javaで標準で上記のような処理を出来るようなメソッドを見つけることができませんでした。このようなメソッドは標準で存在しますでしょうか? 自作する場合、いくつかアプローチがあると考えられますが、最もパフォーマンスを速くしたい場合にはどのような作り方にした方がよいでしょうか。お手数ですが、宜しくお願いします。 <追伸> プレビューで見たら、半角の文字が全角に自動的に変換されてしまいました。。 例文からはわかりにくいかも知れませんが、宜しくお願いします。。

    • ベストアンサー
    • Java
  • ひらがなをカタカナに変換する

    jperlではないperlで、ひらがなをカタカナに変換するにはどのようにすればよろしいのでしょうか? 変換文字列はEUCとしてその変換方法を教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Wordでカタカナのみを全角にする方法

    Word2000です。全角、半角が混在している文で、英数文字だけを半角文字にしたいのですが、文字種の変換で、「半角」にチェックを入れるとカタカナまで半角になってしまいます。カタカナは全角のままで残したいのですが、良い方法はないものでしょうか。 次のどちらかの方法ができれば良いと思うのですが・・・ 1.カタカナのみを全角にする方法 2.英数文字のみを半角にする方法 よろしくお願いします。

  • 半角カタカナを全角カタカナに変換したい

    Windows2000/Microsoft Excel2000です。 入力されている文字列のカタカナが半角になっているのを 全角に一括変換する数式はありますでしょうか? 英数字は半角のまま残したいのですが。 JISを使うと英数字も全角になってしまいます。 ヘルプいただけると大変助かります。

  • ひらがな→カタカナ変換

    ASPの画面で入力されたひらがなの値を、VBスクリプトでカタカナに変換する方法を教えてください。

  • Access97:漢字を除いて全角文字の入力を禁止するには

    使う文字 漢字、半角英数、半角カタカナ、半角括弧() 禁止文字 全角英数、全角カタカナ ひらがな どうやったら入力制限出来るでしょうか?

  • エクセルでの漢字(全角ひらがな・全角カタカナ含む)→半角カタカナへの変換について

    お世話様です。 質問です。 たとえば、「今日のニューヨークは晴れです」という文章を 「キョウノニューヨークハハレデス」というように、半角カタカナに一発で変換することは可能でしょうか? 仕事で商品などを登録する際に半角カタカナでの入力が原則なので、 ひとつひとつ手作業で変換するのは非常に時間がかかってしまいます。 ほかのデータから引っ張ってくることが多いので、phonetic関数は使えないようです。 現在は先輩の作った変換FMがあるのですが、別途立ち上げる必要がありますし、データが重いので会社の貧弱なスペックのパソコンではすぐフリーズしてしまいます。 できれば、A1に「今日のニューヨークは晴れです」とあれば、B1に自動で「キョウノニューヨークハハレデス」と表示されると楽なのですが・・・ 何かいい方法をご存知の方がいらっしゃれば教えていただきたいです。 よろしくお願いいたします。

専門家に質問してみよう