• ベストアンサー

全角文字を判断

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

  • Perl
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • 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

  • フォームに書く文字を自動的に全角から半角文字にする方法は?

    質問です。よく会員登録なんかのページで、住所とか入力するフォームがあると思うんですけど、あれって たとえば郵便番号を入力する場合、文字の入力設定が全角ひらがなになっているのに、フォームに書くと自動的に半角になるっていうのあるじゃないですか。 あれってどういうしくみになっているのですか? javascriptで動いていると思うんですけど、perlかPHPでもできますか?ご存知の方がいらしたら教えてください。よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • outlook 半角→全角に切替できない

    WinXPSP2、Office outlookの予定表内で、数日前から 日本語、英数を問わず全角入力が全くできません。 どのボタンを押しても半角から切り替わらない状況です。 きっかけはあるのでしょうが、思い当たるものがありません。 他のソフトでは問題なく入力できます。 半角/全角ボタン、カタカナ/ひらがなボタンや、 IMEの入力モードをひらがなにしても全く効かない状況で、 仕方なくメモ帳で全角入力したものをコピペして使っています。 ちなみに、たまにブラウザ(IE6)のWebのフォーム入力時も 同じ現象が起こるのですが、その際は (1)一旦IEのアドレスバーにカーソルを置き、 (2)アドレスバー内にてかな入力に切り替え、 (3)アドレスバーにて全角文字を一文字以上打ち込んだ上で 元のWebフォームにカーソルを戻すと、正常な状態に戻っています。 過去ログで似た症状のものを探したのですが、 自分の症状とは少々異なる気が致しまして、 なにか解決策がありましたら教えていただけないでしょうか。 よろしくお願い致します。

  • なぜフォーム等の文字を書く際に全角でないと駄目か?

    とある宅配系やそういったサイトで、フォームを入力する際に、 その他の項目や要望の部分で半角の文字を使用していると 全角に直してくださいと言われる場所がたま~にあるのですが、 なぜこういったサイトは全角でないと 駄目なのでしょうか?駄目な理由がシステム等の都合によってあるのでしょうか? メールアドレスの部分ならともかく、その他の項目や要望の部分で 半角が駄目な理由が分からないのですが・・

  • お問い合わせフォームをつくり、入力して送信すると、名前を全角で入力して

    お問い合わせフォームをつくり、入力して送信すると、名前を全角で入力していると「半角カナ」で入力しないでくださいと表示されます。 メッセージでも同じ表示がされ、結局全ての入力を半角英数で入力すると送信されます。 理由がわかりません。どなたか教えていただけませんか。

  • 全角→半角

    こんにちわ フォームから入力された$titleに全角英数文字が入力された場合 半角に統一したいのですがどうすればよいでしょうか?

    • ベストアンサー
    • Perl
  • 全角、半角文字の判別について

    フォームのテキストで全角なら10文字まで、半角なら20文字まで入力できるようにしたいのですが、EUCの場合、半角カナは2バイトになるため、バイト数で制限をかけるとうまくいきません。かといって文字数で制限をかけてもうまくいきません。 何かいい方法はあるでしょうか?

    • ベストアンサー
    • PHP
  • IME-2000の文字登録、何故か全角・半角が...

    IME-2000を利用しているのですが、英数字が含まれている文字(単語)を登録すると、元々半角の文字を登録しても、何故か半角のみの文字だけでなく、全て全角、半角全角の混在したものが登録されて、いざ変換しようとしたら、変換語列の中に全てが表示され、本来出そうと思っている文字を選び出すのが大変な状態になっています。 もっと面倒なのは、英単語やe-mailアドレス(全て半角の英数字の場合)を登録したときなのですが、半角、全角のみならず、頭文字が大文字、小文字、または大文字・小文字の混在した物と8個も登録されている始末。 こういうのを直すとしたら、どうしたらいいでしょう?

  • メールアドレスが正しいかどうかチェックする方法は?

    フォームから受け取ったメールアドレスが、正しいかどうかをチェックする方法について教えてください。 フォームから受け取ったアドレスが****@vodafone.ne.jpと誤記入されていたため、このアドレス宛にsendmailで送信しようとしたらエラー(Internal Server Error)になりました。(正しくは****@x.vodafone.ne.jp) 「存在しないメールアドレス」の場合は、送信後にuser unknownかhost unknownとしてUndeliveredになりますが、上記の場合、送信そのものができなかったようです。 aaaaaaaa@bbb.******.ne.jp、 aaaaaaaa@******.ne.jp で試してみたところ、同様にエラーになり、 aaaaaaaa@***.ne.jp では送信できました(当然Undeliveredになりましたが)。 「sendmailで送信するときにエラーになるパターン」というようなものがあるのでしょうか? エラーになる前に、メールアドレスが、正しくないという警告を出したいのですが、可能でしょうか? 現在は、メールアドレスに「半角英数と@以外が含まれている」か「@が含まれていない」と警告するようにしています。

    • ベストアンサー
    • CGI
  • 全角文字でアドレス入力・送信

    ある企業HPに問い合わせのアドレスをクリックするとパソコンのOUTLOOKが起動してメールできる状態になります。 アドレスの文字に一つだけ全角の-があるのですが、普通に送信できます。 しかし、アドレスをコピー&ペーストしてホットメールで送ろうとすると、「認識できない文字がある」と送信できません。 OUTLOOKには全角アルファベットを半角に修正しているとわかりますが、これはメールを送るどのアプリケーションも修正されますか?

  • 正規表現の全角、半角、大文字、小文字の区別について

    こんにちわ 最近正規表現の勉強をし始めたのですが フォームから入力された$keywordの 全角、半角、大文字、小文字の区別をなくすには どうすれば可能なのでしょうか? 今のところ効率などは求めていませんので 初心者が理解できるくらい簡単なご返答をよろしくお願いします

    • ベストアンサー
    • Perl

専門家に質問してみよう