• 締切済み

[正規表現]メールアドレスのチェックについて

メールアドレスのローカル部に不正な文字が使われていないかをチェックするものを作成しましたが、許可されるはずの'(シングルクォーテーション)だけがNGになってしまいます。 環境はPHP5、ソースは下記のとおりなのですがアドバイスいただけないでしょうか。 <認める文字> a-z A-Z 0-9 ! # $ % & ' * + - / = ? ^ _ ` { | } ~ <チェック部分のソース> preg_match("/^\s*[-\w._!#$%&\'*+\\/=?^`{|}~]", $add_local) <現象> テストで「!#$%&'*+-/=?^_`.{|}~」をチェックするとNG '(シングルクォーテーション)を消した同アドレスはOK

noname#102084
noname#102084
  • PHP
  • 回答数2
  • ありがとう数2

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

なるほど勉強用でしたらたとえば以下のようにpreg_quote()すると 効率的でしょう。 <? $add_local="!#$%&'*+-/=?^_`.{|}~"; $pattern="\w\-".preg_quote("!#$%&'*+/=?^`.{|}~","/"); if(preg_match("/^[".$pattern."]+$/", $add_local)) print "OK"; else print "NG"; print $pattern; ?> ちなみに\wには「_」も含まれます、「-」は特殊なので別途指示しています 前回例示してあるとおり、quoted-stringで処理されている可能性 も視野に入れると、かなり正規表現としては面倒な部類になると おもいますよ

noname#102084
質問者

お礼

半年越しのお礼になってしまい大変申し訳ありません。 結局解決できず、最近になってたまたま(?)解決できたのでしめさせていただこうと思います。 教えていただいたpreg_quote()も導入しましたが、当時は'だけがNGなわけがわかりませんでした。 ところが、最近になって文字コードをShift_JisからUTF8に変更し、PGのほうもそれに対応したところ'もOKになりました。 どうやらShift_Jisのせいだったようです。(多分ですが・・・) アドバイスをいただいておきながら長らく放置してしまい申し訳ありませんでした。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

最近同じような質問が何度かでていますが、 結局無駄なのであまり厳密にチェックする必要はありません。 ルールはこちらをご覧ください http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9#.E3.83.AD.E3.83.BC.E3.82.AB.E3.83.AB.E9.83.A8.E3.81.AB.E4.BD.BF.E7.94.A8.E3.81.A7.E3.81.8D.E3.82.8B.E6.96.87.E5.AD.97 入力チェックというのはあくまでも、入力時のタイポのチェックや 入力の勘違いを指摘する程度のものです。 こまかくチェックしても、結局はそのユーザーアカウントが存在 するかをチェックしているわけではないですから、やるだけ無駄です。 ・@が1回ありその前後に文字がある。 ・ドメイン部分に連続しないピリオドが1回以上ある 程度調べればよいでしょう。 どうせ嘘をかいてくればチェックの意味はないのですから。

noname#102084
質問者

補足

回答ありがとうございます。 ご指摘いただいたことは私も承知しており、参考URLのほうも確認いたしました。 今回質問させていただいた内容は、個人的な学習として挑戦している部分が大きいと思います。 「メールアドレスのチェック」としておりますが、正規表現の書き方に関する質問としたほうがよかったですね。申し訳ありません。 引き続き、質問文にあるソースへのご指摘をお待ちしております。

関連するQ&A

  • 正規表現について

    PHP5.2.4を使用しています。 1文字以上のアルファベットと数字の組み合わせは許可(含めて) かつ 「ab」は許可しない(含めない) という正規表現はどのように記述すれば良いのでしょうか?(「01ab」「abc」は許可、「ab」は許可しない) 一応自分なりに考えてみたのですが、 $str = "abc"; if (preg_match("/[^(ab)][a-z0-9]+/", $str)) { print "match<br>\n"; } やはり駄目でした・・・

    • ベストアンサー
    • PHP
  • 複数メールアドレスのチェック

    現在、phpにてメールフォームを制作していますが、送信先に複数メールアドレスを指定した際の正規表現でチェックしたいと思っているのですが、全く分かりません。 正規表現で「preg_match("/^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/i",$value)」としていますが、「aaa@aa.aa,bbb@bb.bb」などカンマでメールアドレスを複数(1~5アドレスを想定)区切った場合、エラーが出てしまいます。 どのようにしたら、うまくいくか教えていただけないでしょうか? 色々と調べましたがわかりません。 大変申し訳ないですが、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 正規表現について

    お世話になります。 いろいろ調べてテストもしたのですが、 どうしてもわからないのでヒントをください。 やりたいことは、PHPでパスワードチェックを したいのです。 a-z A-Z 0-9 _- 以外の文字が入ったらエラーを返したい のですが、方法がわかりません。 そもそもpreg_matchをつかうのか、eregを使うのか・・・ どうか、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 正規表現でシングルクォーテーション内の文字列を取る

    正規表現でどうしても分からない状態です。よろしくお願いします。 PHP5.2で、 'You\'re pen' というシングルクォーテーションで囲まれた文字列を 正規表現で取得しようとしています。 preg_match_all("/\'([^\']*|\\\')*?\'/", $src, $matches); のようにしていますが、どうしても 'You\' までしか取れません。 どうしたら取れるでしょうか。。m(_ _)m

  • if文でチェックしている内容を教えてください

    メールアドレスをチェックしているif文ですが どんな内容をチェックしているのでしょうか? if (preg_match('/^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/i', $mailaddress))・・・

    • ベストアンサー
    • PHP
  • 正規表現について

    今現在、PHPの勉強をしているのですが preg_match("/\nFrom:\s*(.+)\r/i", $sss, $aaaa) という文字列が出てきて困っています。 preg_match関数における\nFrom:とは一体何なんでしょうか。教えてください。

    • 締切済み
    • PHP
  • 正規表現について

    PHP5.2.4を使用しています。 任意の数の引数がある文字列をpreg_matchを使ってマッチさせたいのですが、 例えば"ENUM(ab,cd)"は ab と cd の2つの引数があるとします。 次のようなパターン文字列まではアイデアとして浮かんだのですが、 引数の最後は , がないので当然ですがマッチしません・・・ どのようにパターン文字列を記述すれば良いのでしょうか? $str = "ENUM(ab,cd)"; if (preg_match("/ENUM\(([^\,]+\,)+\)/", $str, $match)) { print "{$match[0]}<br>\n"; }

    • 締切済み
    • PHP
  • 正規表現のコーディングについてお願いします。

    こんにちは、よろしくお願いいたします。 正規表現パターンを書く場合に皆さんがどのようにされているか教えてください。 例えば(ちょっとムリヤリ感が強いですが)、'Price \5800-' という文字列の \5800 の部分に preg_match でマッチさせたいとします。 単純に考えると、 /\\\d+/ のようなパターンが思いつくのですが、それを文字列として preg_match に渡す際に、コードはどのように書かれますか? <?php   $str = 'Price \5800-';   //とりあえず、'/\\\d+/' と書き、'/\\\\\\d+/' と、\ をそれぞれの \ に書き足す   if ( preg_match('/\\\\\\d+/', $str, $match) ) {     print_r($match);   } ?> 「まず、パターンを書き、全ての \ の前に \ を書き足す。」というのが無難なのかな?と思い、そうしていますが、 そういった考え方で間違っていないでしょうか? どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • 正規表現で切り出せません。 < と > の間?

    宜しくお願いいたします。 PHP5.1.6です。 メールの受信をするときにメールアドレスだけを切り出したいのですが うまく出来ません。 【例-1】の様に、すると < > の間が表示するのですが 【例-2】の例のように、変数を入れると何も表示しません。 【例-1】で使用した文字列は、【例-2】の$from を echo で表示させたものをコピーしています どのようにしたらいいでしょうか? 宜しくお願いいたします。 【例-1】 $test="教えてお名前 <****@*******.com>"; $pattern = "<(.*)>"; if (preg_match( "/".$pattern."/i", $test, $match ) ){ //$from0 = $match[0]; $from1 = $match[1]; //echo $from0; echo $from1; } これで、うまく echo $from1 でメールアドレスだけ表示してくれます。 *** なぜか、$from0 には元の文字列は表示しませんが。 置き換える元の文字列を下記変数に変えると表示しません。 【例-2】 $mboxes = imap_check($mbox); $head = imap_header($mbox, $i); $from = htmlspecialchars(mb_decode_mimeheader($head->fromaddress)); $pattern = "<(.*)>"; if (preg_match( "/".$pattern."/i", "$from", $match ) ){ //$from0 = $match[0]; $from1 = $match[1]; //echo $from0; echo $from1; } **$from の所は "" で囲んだり、外したりしましたが一緒でした。

    • ベストアンサー
    • PHP
  • 正規表現パターン'/^[a-z0-9]+$/iD' の最後の"D"について

    こんにちは。今PHPの勉強をしているものです。 勉強中、ctype_alnum()という関数がわからなかったのでPHPマニュアルで調べたら、「この関数は preg_match('/^[a-z0-9]+$/iD', $text) と等価です。」と書いてありましたが、英字または 数字であるかどうかを調べるのなら、パターンは'/^[a-z0-9]+$/i'だけでいいと思いますが、最後のDはいったいなんなのでしょうか?修飾子で調べて見ましたがDなどといったものは見当たりませんでした。どなたか教えていただけませんか。

    • ベストアンサー
    • PHP