• ベストアンサー

全角文字を判断

お世話になります。Perl初心者です。 SendMailとやらをはじめて使ったプログラミングをしたのですが、Emailアドレスをもし全角文字で入力されると、Internal Server Errorになります。 ですから、もし送信フォームのEmailアドレスを全角で入力して送信ボタンを押すと「メールアドレスを半角で入力してください・・・」みたいな事をしたいのですが、ここではたっと、その判断の条件式はどう書いたらよいのか判らないことに気がつきました。過去ログも見て、なにやらそれらしいものがありますが、私より良く知っている人たちの問答で、もひとつよくわかりません。 少々あほを相手にしているとこらえていただき、詳しくやりかた教えてください。

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

  • ベストアンサー
  • Dpop
  • ベストアンサー率51% (279/544)
回答No.3

#1 です。 正規表現です。(^^;) > email-opt.pl を元に冗長部分を削り落としたのが以下のスクリプトです.冗長部分を削り落としてもかなりの量です. の下にあるやつを遣います。それを関数にしてみました。 使い方例も示しましたが、ifemailにメールアドレスを入れて呼び出します。妥当な メールアドレスだと 0 を、違う場合には 1 を返すようにしてあります。 逆のほうがよければ、 $r = ($email =~ /^$mailbox$/o) ? 0 : 1; の行を $r = ($email =~ /^$mailbox$/o) ? 1 : 0; として下さい。sub ifemail の行から上は、呼び出し方例ですので、実際のコードにコピーする必要はありません。(ついでに、Perl5 では @ は \@ と書く決まりになっているので、\@ と書いてあります。ファイルから読み込んだり、フォームから読み込まれる場合には、\ は意識する必要はありません。) print &ifemail("aaa\@aaa.com"). "\n"; print &ifemail("aaa\@aaa.com"). "\n"; exit(0); sub ifemail { my($email) = @_; $esc = '\\\\'; $Period = '\.'; $space = '\040'; $tab = '\t'; $OpenBR = '\['; $CloseBR = '\]'; $OpenParen = '\('; $CloseParen = '\)'; $NonASCII = '\x80-\xff'; $ctrl = '\000-\037'; $CRlist = '\n\015'; $qtext = qq/[^$esc$NonASCII$CRlist\"]/; $dtext = qq/[^$esc$NonASCII$CRlist$OpenBR$CloseBR]/; $quoted_pair = qq<${esc}[^$NonASCII]>; $ctext = qq<[^$esc$NonASCII$CRlist()]>; $Cnested = qq<$OpenParen$ctext*(?:$quoted_pair$ctext*)*$CloseParen>; $comment = qq<$OpenParen$ctext*(?:(?:$quoted_pair|$Cnested)$ctext*)*$CloseParen>; $X = qq<[$space$tab]*(?:${comment}[$space$tab]*)*>; $atom_char = qq/[^($space)<>\@,;:\".$esc$OpenBR$CloseBR$ctrl$NonASCII]/; $atom = qq<$atom_char+(?!$atom_char)>; $quoted_str = qq<\"$qtext*(?:$quoted_pair$qtext*)*\">; $word = qq<(?:$atom|$quoted_str)>; $domain_ref = $atom; $domain_lit = qq<$OpenBR(?:$dtext|$quoted_pair)*$CloseBR>; $sub_domain = qq<(?:$domain_ref|$domain_lit)$X>; $domain = qq<$sub_domain(?:$Period$X$sub_domain)*>; $route = qq<\@$X$domain(?:,$X\@$X$domain)*:$X>; $local_part = qq<$word$X(?:$Period$X$word$X)*>; $addr_spec = qq<$local_part\@$X$domain>; $route_addr = qq[<$X(?:$route)?$addr_spec>]; $phrase_ctrl = '\000-\010\012-\037'; $phrase_char = qq/[^()<>\@,;:\".$esc$OpenBR$CloseBR$NonASCII$phrase_ctrl]/; $phrase = qq<$word$phrase_char*(?:(?:$comment|$quoted_str)$phrase_char*)*>; $mailbox = qq<$X(?:$addr_spec|$phrase$route_addr)>; $r = ($email =~ /^$mailbox$/o) ? 0 : 1; ($r); }

souta_n
質問者

お礼

見捨てず、ご丁寧な例までいただきましてありがとうございます。関数化までしてもらったので、がんばってやってみます。

その他の回答 (2)

  • namiri_e
  • ベストアンサー率37% (37/98)
回答No.2

やっぱり「正規表現」を使うのがいいですね。 正規表現というのは、文字列を条件別に検索して合致するかどうかを判断するものです。 詳しくは「正規表現」と検索すると詳しいサイトがたくさんあります。 具体的には、No1の方と同じサイトの http://www.din.or.jp/~ohzaki/perl.htm#Character の部分を参考に日本語をすべてにマッチするようにもできますし、 メールアドレス欄に入力された文字列を、splitで1文字単位に分割して、 それらの文字の中に2バイト文字(全角文字のことです)が混じってないかを正規表現で調べてやってもできると思います。

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

お礼

あ~やっぱり例の壁画だ! みんなこんなこと分かるんだ・・・これをいったいどうすればよいのだろう・・・

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.1

目的から、こちらの方が良いと。。。 全角文字を探す。ではなく、メールアドレスとして適当か。と言うことをチェックするスクリプト(と言うか、巨大な正規表現と言うか。)があります。 Perlメモ - メールアドレスの正規表現 http://www.din.or.jp/~ohzaki/perl.htm#Mail

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

お礼

開いて・・・あ~びっくりした! エジプトのツタンカーメン王の墓の壁画かと思いました。 とっところで私はこれをいかようにすればよいのやら・・・(^_^;)

関連するQ&A