http://FMPro.jp  FileMaker Pro 関連総合ポータルサイト

IsValidEmail 関数

カテゴリー : テキスト処理
計算結果のデータタイプ : テキスト
対応FileMakerバージョン : 対応 7  対応 8  対応 8.5  対応 9  対応 10
作者 : 社本修司 株式会社ジェネコム

概要

<メールアドレス>が妥当な場合に真「1」を返します。妥当ではない場合、偽「0」を返します。

構文

IsValidEmail ( メールアドレス ; オプション )

引数

引数名タイプ備考
メールアドレステキスト任意のテキストfoo @example.com
オプション数字0 か 1
1の場合、真偽のかわりに理由を返します。
1

別のウィンドウで、引数の値を変更してテストすることが出来ます

IsValidEmail ( "foo @example.com" ; 1 )

結果

アカウント(@の左側)に無効な文字列(" "スペース)が含まれています

/*==============================================================
  カスタム関数 IsValidEmail ( メールアドレス ; オプション )

<メールアドレス>が妥当な場合に真「1」を返します。妥当ではない場合、偽「0」を返します。
オプションに「1」を指定することで偽の場合にその理由を返し、真の場合はnull値を返します。
(オプション「0」の場合の結果は「1」か「0」)

# トップレベルドメインは2006年4月現在申請中も含む <http://www.nic.ad.jp/ja/dom/types.html> 参照
# ドメイン名のルールは JPNIC の「ドメイン名のしくみ」を参照 <http://www.nic.ad.jp/ja/dom/system.html>
# ドメイン名のラベルは第6レベルまで判定
# ローカルパートで利用出来る文字列は RFC2822 3.2.4. Atom の atext による
# 日本語訳 <http://www.puni.net/~mimori/rfc/rfc2822.txt> 参照
# ()によるコメントや、""によるローカルパート表記、日本語ドメインを含む国際化ドメイン名は考慮していません

このカスタム関数を引用するに当たっては、必ずコメントも一緒に引用してください。
==============================================================*/


Let
(
    [
    ADDR_SPEC = Lower ( メールアドレス ) ;
    OPTION = オプション ;

    TLD_LIST =
        "com¶net¶org¶edu¶gov¶mil¶int¶info¶biz¶name¶pro¶museum¶aero¶coop¶jobs¶travel¶mobi¶cat¶post¶tel¶xxx¶asia¶arpa¶ac¶ad¶ae¶af¶ag¶ai¶al¶am¶an¶ao¶aq¶ar¶as¶at¶au¶aw¶ax¶az¶ba¶bb¶bd¶be¶bf¶bg¶bh¶bi¶bj¶bm¶bn¶bo¶br¶bs¶bt¶bv¶bw¶by¶bz¶ca¶cc¶cd¶cf¶cg¶ch¶ci¶ck¶cl¶cm¶cn¶co¶cr¶cs¶cu¶cv¶cx¶cy¶cz¶de¶dj¶dk¶dm¶do¶dz¶ec¶ee¶eg¶eh¶er¶es¶et¶eu¶fi¶fj¶fk¶fm¶fo¶fr¶ga¶gb¶gd¶ge¶gf¶gg¶gh¶gi¶gl¶gm¶gn¶gp¶gq¶gr¶gs¶gt¶gu¶gw¶gy¶hk¶hm¶hn¶hr¶ht¶hu¶id¶ie¶il¶im¶in¶io¶iq¶ir¶is¶it¶je¶jm¶jo¶jp¶ke¶kg¶kh¶ki¶km¶kn¶kp¶kr¶kw¶ky¶kz¶la¶lb¶lc¶li¶lk¶lr¶ls¶lt¶lu¶lv¶ly¶ma¶mc¶md¶mg¶mh¶mk¶ml¶mm¶mn¶mo¶mp¶mq¶mr¶ms¶mt¶mu¶mv¶mw¶mx¶my¶mz¶na¶nc¶ne¶nf¶ng¶ni¶nl¶no¶np¶nr¶nu¶nz¶om¶pa¶pe¶pf¶pg¶ph¶pk¶pl¶pm¶pn¶pr¶ps¶pt¶pw¶py¶qa¶re¶ro¶ru¶rw¶sa¶sb¶sc¶sd¶se¶sg¶sh¶si¶sj¶sk¶sl¶sm¶sn¶so¶sr¶st¶sv¶sy¶sz¶tc¶td¶tf¶tg¶th¶tj¶tk¶tl¶tm¶tn¶to¶tp¶tr¶tt¶tv¶tw¶tz¶ua¶ug¶uk¶um¶us¶uy¶uz¶va¶vc¶ve¶vg¶vi¶vn¶vu¶wf¶ws¶ye¶yt¶yu¶za¶zm¶zw¶su¶" ;
        // トップレベルドメインのリスト <http://www.nic.ad.jp/ja/dom/types.html> 参照
        // su 旧ソビエト連邦 wikipediaによると未だに使われているらしい
    JP_LIST = "ac¶co¶go¶or¶ad¶ne¶gr¶ed¶lg¶" ;     // 属性型(組織種別型)JPドメイン名の属性リスト

    P_SEPARATOR = Position ( ADDR_SPEC ; "@" ; 1 ; PatternCount ( ADDR_SPEC ; "@" ) ) ;     // @が2回以上書かれた場合を考慮して最後の@をドメインとの区切りとする
    LOCAL_PART = Left ( ADDR_SPEC ; P_SEPARATOR - 1 ) ;     // ローカルパート(アカウント名)
    DOMAIN = Right ( ADDR_SPEC ; Length ( ADDR_SPEC ) - P_SEPARATOR ) ;    // ドメイン名

    P_LAST_DOT = Position ( DOMAIN ; "." ; 1 ; PatternCount ( DOMAIN ; "." ) ) ;
    P_LAVEL2_DOT = Position ( DOMAIN ; "." ; 1 ; PatternCount ( DOMAIN ; "." ) - 1 ) ;
    P_LAVEL3_DOT = Position ( DOMAIN ; "." ; 1 ; PatternCount ( DOMAIN ; "." ) - 2 ) ;
    P_LAVEL4_DOT = Position ( DOMAIN ; "." ; 1 ; PatternCount ( DOMAIN ; "." ) - 3 ) ;
    P_LAVEL5_DOT = Position ( DOMAIN ; "." ; 1 ; PatternCount ( DOMAIN ; "." ) - 4 ) ;
    P_LAVEL6_DOT = Position ( DOMAIN ; "." ; 1 ; PatternCount ( DOMAIN ; "." ) - 5 ) ;

    TOP_LEVEL_DOMAIN = Middle ( DOMAIN ; P_LAST_DOT + 1 ; Length ( DOMAIN ) - P_LAST_DOT ) ;     // トップレベルドメイン
    LAVEL2 = Middle ( DOMAIN ; P_LAVEL2_DOT + 1 ; P_LAST_DOT - P_LAVEL2_DOT - 1 ) ;     // 第2レベルドメイン
    LAVEL3 = Middle ( DOMAIN ; P_LAVEL3_DOT + 1 ; P_LAVEL2_DOT - P_LAVEL3_DOT - 1 ) ;     // 第3レベルドメイン
    LAVEL4 = Middle ( DOMAIN ; P_LAVEL4_DOT + 1 ; P_LAVEL3_DOT - P_LAVEL4_DOT - 1 ) ;     // 第4レベルドメイン
    LAVEL5 = Middle ( DOMAIN ; P_LAVEL5_DOT + 1 ; P_LAVEL4_DOT - P_LAVEL5_DOT - 1 ) ;     // 第5レベルドメイン
    LAVEL6 = Middle ( DOMAIN ; P_LAVEL6_DOT + 1 ; P_LAVEL5_DOT - P_LAVEL6_DOT - 1 ) ;     // 第6レベルドメイン

    DOCOMO = Exact ( DOMAIN ; "docomo.ne.jp" ) or Exact ( DOMAIN ; "ezweb.ne.jp" ) or PatternCount ( DOMAIN ; ".ezweb.ne.jp" ) ;     // 携帯アドレス特別ルール判定用
    JP = Exact ( TOP_LEVEL_DOMAIN ; "jp" ) and Length ( LAVEL2 ) ≤ 2 ;     // 属性型(組織種別型)JPドメイン判定用
    JO = Exact ( TOP_LEVEL_DOMAIN ; "jo" ) and Length ( LAVEL2 ) ≤ 2 ;     // JP のtypo対策(ヨルダンドメインの属性は3文字)

    FILTERE_LOCAL_PART =
       Filter (
            LOCAL_PART ;
            "abcdefghijklmnopqrstuvwxyz" &
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ" &
            "0123456789" &
            "!#$%&'*+-/=?^_`{|}~" &
            "."
        ) ;
    FILTERE_DOMAIN =
       Filter (
            DOMAIN ;
            "abcdefghijklmnopqrstuvwxyz" &
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ" &
            "0123456789-."
        ) ;

    RESULT =
       Case (
           IsEmpty ( ADDR_SPEC ) ;
                "メールアドレスが空です" ;

           PatternCount ( ADDR_SPEC ; "@" ) = 0 or
           IsEmpty ( DOMAIN ) ;
                "ドメイン(@の右側)が空です" ;
           PatternCount ( DOMAIN ; "." ) = 0 ;
                "無効なドメイン(@の右側)です" ;
           Length ( DOMAIN ) > 255 ;
                "ドメイン(@の右側)が長すぎます" ;     // ドメイン名全体の長さは255文字以下
           Length ( LAVEL2 ) > 63 or
           Length ( LAVEL3 ) > 63 or
           Length ( LAVEL4 ) > 63 or
           Length ( LAVEL5 ) > 63 or
           Length ( LAVEL6 ) > 63 ;
                "無効なドメイン(@の右側)です" ; // 各ラベルの長さは63文字以下
           Left ( DOMAIN ; 1 ) = "-" ;
                "ドメインの最初を\"-\"(ハイフン)にすることは出来ません" ;
           Left ( LAVEL2 ; 1 ) = "-" or Right ( LAVEL2 ; 1 ) = "-" or
           Left ( LAVEL3 ; 1 ) = "-" or Right ( LAVEL3 ; 1 ) = "-" or
           Left ( LAVEL4 ; 1 ) = "-" or Right ( LAVEL4 ; 1 ) = "-" or
           Left ( LAVEL5 ; 1 ) = "-" or Right ( LAVEL5 ; 1 ) = "-" or
           Left ( LAVEL6 ; 1 ) = "-" or Right ( LAVEL6 ; 1 ) = "-" ;
                "無効なドメインです(\".\"(ドット)の直前または直後を\"-\"(ハイフン)にすることは出来ません)" ;     // ラベルの先頭と最後にハイフンは使用できない
            not Exact ( DOMAIN ; FILTERE_DOMAIN ) and PatternCount ( DOMAIN ; "¶" ) ;
                "ドメイン(@の右側)に無効な文字列(改行)が含まれています" ;
            not Exact ( DOMAIN ; FILTERE_DOMAIN ) and ( PatternCount ( DOMAIN ; " " ) or PatternCount ( DOMAIN ; " " ) ) ;
                "ドメイン(@の右側)に無効な文字列(\" \"スペース)が含まれています" ;
            not Exact ( DOMAIN ; FILTERE_DOMAIN ) ;
                "ドメイン(@の右側)に無効な文字列が含まれています" ;
           Left ( DOMAIN ; 1 ) = "." ;
                "ドメイン(@の右側)の最初を\".\"(ドット)にすることは出来ません" ;
           Right ( DOMAIN ; 1 ) = "." ;
                "ドメイン(@の右側)の最後を\".\"(ドット)にすることは出来ません" ;
           PatternCount ( DOMAIN ; ".." ) ≥ 1 ;
                "ドメイン(@の右側)に\"..\"を含める(ドットを二つ続ける)ことは出来ません" ;
           IsEmpty ( FilterValues ( TOP_LEVEL_DOMAIN ; TLD_LIST ) ) ;
                "トップレベルドメイン(最後の\".jp\"など)が無効です" ;
            JP and IsEmpty ( FilterValues ( LAVEL2 ; JP_LIST ) ) ;
                "ドメインの属性(\".co\"や\".ne\"など)が無効です" ;     // 属性型(組織種別型)JPドメインの場合は属性もチェック
            JO and not IsEmpty ( FilterValues ( LAVEL2 ; JP_LIST ) ) ;
                "ヨルダン(Jordan)ドメインの属性は \".com, .org, .edu, .mil, .net, .gov\" のいずれかです" ;

            not Exact ( LOCAL_PART ; FILTERE_LOCAL_PART ) and ( PatternCount ( LOCAL_PART ; " " ) or PatternCount ( LOCAL_PART ; " " ) ) ;
                "アカウント(@の左側)に無効な文字列(\" \"スペース)が含まれています" ;
            not Exact ( LOCAL_PART ; FILTERE_LOCAL_PART ) ;
                "アカウント(@の左側)に無効な文字列が含まれています" ;
           Left ( LOCAL_PART ; 1 ) = "." ;
                "アカウントの最初を\".\"(ドット)にすることは出来ません" ;

            not DOCOMO and Right ( LOCAL_PART ; 1 ) = "." ;
                "アカウント(@の左側)の最後を\".\"(ドット)にすることは出来ません" ;
            not DOCOMO and PatternCount ( LOCAL_PART ; ".." ) ≥ 1 ;
                "アカウント(@の左側)に\"..\"を含める(ドットを二つ続ける)ことは出来ません" ;
                // docomo.ne.jp ないしは ezweb.ne.jp の場合、.の扱いが RFC2822 で認められていない使い方ができるため
        )
    ] ;

   Case (
        OPTION ;
            RESULT ;
            IsEmpty ( RESULT )
    )

)
// ©2006,SHAMOTO Syuji <http://www.FMPro.jp>

エンコードは Unicode (UTF-8)、改行タイプは LF (Unix) 形式のテキストとして保存します。
テキストエディタで正常に開かない場合は、エンコードを指定してファイルを開くようにしてください。

詳細説明

<メールアドレス>が妥当な場合に真「1」を返します。妥当ではない場合、偽「0」を返します。
オプションに「1」を指定することで偽の場合にその理由をかえし、真の場合はnull値を返します。
(オプション「0」の場合の結果は「1」か「0」)
()によるコメントや、""によるローカルパート表記、日本語ドメインを含む国際化ドメイン名は考慮していません。

この関数が使用する他のカスタム関数

この関数を使用する他のカスタム関数

注意:ここで紹介されているカスタム関数をご自分のシステムに組み込んだ場合に発生した問題についてはFMPro.jpは責任を負いません。

Copyright © 2004-2009 FMPro.jp All Rights Reserved.