user2147283

電子メールアドレスの検証方法

Discussion created by user2147283 on Jul 26, 2018
Latest reply on Jul 29, 2018 by user2147283

以下の電子メールアドレス検証スクリプトを書いて見ました。

スクリプトトリガ設定は、該当フィールドの、OnObjectExit へ設定します。

 

 

他の方が書いたスクリプトもみてみたいので、アドバイスやツッコミをお待ちしてます。

 

#Last Updated: 2018/7/26

Creation Date: 2018/7/24 , Author: PgFlow YOUHEI SASAKI

PhoneNumber: 08059794102 , Email: youheisasaki@outlook.jp

 

Filter_EmailAddress.PgFlow Script Overview

・ダイアログで警告

入力テキストの2個以上の"@"(アットマーク)と"@"の有無

@以降の入力テキストの2個以上連続した".."(ピリオド)

@以降の入力テキストの最初と最後の"."(ピリオド)

"@"(アットマーク)より前は64文字以内、1文字以上

"@"(アットマーク)より後ろは253文字以内、4文字以上

メールアドレス全体の長さは、254文字以内、5文字以上

 

・入力値から取り除きたいもの

テキストスタイル

改行

前後のスペース

@以降の入力テキストのスペース(空白文字)全て

 

・変換したい入力内容

入力テキストの全角英数字記号を半角英数字記号へ変換

小文字への変換「ABC」→「abc」

 

【電子メールアドレスの構成】

https://ja.wikipedia.org/wiki/メールアドレス

 

ローカル部に使用できる文字は以下のASCII文字である。

まず、次のASCII文字をそのまま並べた形式(RFC 5321ではDot-string、RFC 5322ではdot-atomと呼ぶ)が使用できる。

大小のラテン文字(本来は大文字・小文字は区別されるが、実際には区別されていない実装がほとんどである[3]。一般的には小文字で表記される)

数字

! # $ % & ' * + - / = ? ^ _ ` { | } ~(実際には、プロバイダ側で利用可能な記号文字を一部のみに制限している場合が多い)

.(先頭と末尾以外で使用可能。2個以上連続してはならない)

さらに、“" "”でくくられたquoted-stringの形式であれば、加えて次のASCII文字を使用できる[4]。

( ) < > [ ] : ; @ ,

.(quoted-string中では制限はない)

スペース

さらにquoted-string中では、“\”を前につけたquoted-pairの形式であれば、加えて次のASCII文字を使用できる。

\ "

 

フィールド名を変数$FieldNameへ設定

変数を設定 [ $FieldName; 値:Get(アクティブフィールド名) ]

#フィールド値を変数$InputValueへ設定

変数を設定 [ $InputValue; 値:TextFormatRemove ( GetField ( Get(アクティブフィールド名 ) ) ) ]

#フィールド値から前後の空白と改行を取り除き、英数字を半角英数字へ変換し変数$FilterValueへ設定

変数を設定 [ $FilterValue; 値:Lower ( RomanHankaku ( Substitute ( Trim ( $InputValue ) ; ¶ ; "") ) ) ]

#@が一つだけ含まれているか判別する変数、$EmailCharacterErrorへ"False"を設定

変数を設定 [ $EmailCharacterError; 値:"False" ]

#@以降の入力テキストに"."(ピリオド)が含まれているか判別する変数$AfterAtMarkPeriodErrorへ"False"を設定

変数を設定 [ $AfterAtMarkPeriodError; 値:"False" ]

#2個以上続く文字をエラーとして判別する変数、$CoupleCharacterErrorへ"True"を設定

変数を設定 [ $CouplePeriodError; 値:"True" ]

#エラーメッセージを変数$ErrorMessageへ設定

変数を設定 [ $ErrorMessage; 値:" " & "は、正しい電子メールアドレスの構成でないため登録できません。¶(注意:改行は出来ません)" ]

 

#入力テキストから2個以上の"@"または、"@"が一つも含まれない場合、変数$EmailCharacterErrorへ"False"を設定

If [ PatternCount ( $FilterValue ; "@" ) = 1 ]

    #@が一つだけ含まれているか判別する変数、$EmailCharacterErrorへ"True"を設定

    変数を設定 [ $EmailCharacterError; 値:"True" ]

    #@より前の文字列を、変数$BeforeAtMarkCharacterへ設定

    変数を設定 [ $BeforeAtMarkCharacter; 値:Middle ( $FilterValue ; 1 ; ( Position ( $FilterValue ; "@" ; 1 ; 1 ) - 1 ) ) ]

    #@より後ろの文字列を、変数$AfterAtMarkCharacterへ設定

    変数を設定 [ $AfterAtMarkCharacter; 値:TrimAll ( Middle ( $FilterValue ; Position ( $FilterValue ; "@" ; 1 ; 1 ) + 1 ; Length ( $FilterValue ) - ( Position ( $FilterValue ; "@" ; 1 ; 1 ) - 1 ) ) ; 3 ; 3 ) ]

Else

    #@が含まれていない場合、変数$EmailCharacterErrorへ"False"を設定

    変数を設定 [ $EmailCharacterError; 値:"False" ]

End If

 

#@以降の入力テキストから2個以上連続した".."(ピリオド)を見つけ、変数$CouplePeriodErrorへ"False"を設定

If [ PatternCount ( $AfterAtMarkCharacter ; "." ) ≥ 2 ]

    #先頭文字位置を変数$iFへ設定

    変数を設定 [ $iF; 値:1 ]

    #検索回数を変数$iNへ設定

    変数を設定 [ $iN; 値:1 ]

    #検索対象文字列の長さを変数$iLへ設定

    変数を設定 [ $iL; 値:Length ( $AfterAtMarkCharacter ) ]

    #@以降の入力テキストに連続した"ピリオド"が無いか検索

    Loop

        Exit Loop If [ $iL = $iN ]

        #テキスト内で一つめの"ピリオド"を検索し、指定された回数目の先頭文字位置を変数$iPへ設定

        変数を設定 [ $iP; 値:Position ( $AfterAtMarkCharacter ; "." ; $iF ; $iN ) ]

        #変数$iNへ値+1を追加する。(ループを抜けるためと、検索文字位置の移動の為)

        変数を設定 [ $iN; 値:$iN + 1 ]

        #テキスト内で二つめの"ピリオド"を検索し、指定された回数目の先頭文字位置を変数$iP2へ設定

        変数を設定 [ $iP2; 値:Position ( $AfterAtMarkCharacter ; "." ; $iF ; $iN ) ]

        #検索したスペースの文字位置が連続しているかを確認。

        If [ $iP = ($iP2 - 1) ]

            #2個以上続く"ピリオド"が見つかれば変数$CoupleSpaceErrorへ"False"を設定

            変数を設定 [ $CouplePeriodError; 値:"False" ]

        End If

        End Loop

End If

 

#@以降の入力テキストの最初と最後の"."(ピリオド)を見つけ、変数$AfterAtMarkPeriodErrorへ"False"を設定

If [ PatternCount ( $AfterAtMarkCharacter ; "." ) ≥ 1 and $EmailCharacterError = "True" ]

    変数を設定 [ $LengthAfterAtMarkCharacter; 値:Length ( $AfterAtMarkCharacter ) ]

    変数を設定 [ $AfterAtMarkPeriodError; 値:Case ( Left($AfterAtMarkCharacter; 1 )= "."; "False"; Right($AfterAtMarkCharacter; 1 )= "."; "False"; "True" ) ]

Else

    #@以降の入力テキストに"."(ピリオド)が含まれない場合も、変数$AfterAtMarkPeriodErrorへ"False"を設定

    変数を設定 [ $AfterAtMarkPeriodError; 値:"False" ]

End If

 

#フィールドに値が入っていない場合は、なにも行わない

If [ IsEmpty ( $InputValue ) ]

    #入力されたフィールド値とフィルター後の値が同じであること、メールアドレスの構成条件を満たしていることを確認

Else If [ $EmailCharacterError = "True" and $AfterAtMarkPeriodError = "True" and $CouplePeriodError = "True" and Exact ( $InputValue ; $FilterValue ) and Length ( $BeforeAtMarkCharacter ) ≤ 64 and Length( $BeforeAtMarkCharacter ) ≥ 1 and Length ( $AfterAtMarkCharacter ) ≤ 253 and Length ( $AfterAtMarkCharacter ) ≥ 4 and Length ( $FilterValue ) ≤ 254 and Length ( $FilterValue ) ≥ 5 ]

    #検証され書式を除いた値をフィールドへ設定

    フィールド設定 [ $BeforeAtMarkCharacter & "@" & $AfterAtMarkCharacter ]

    現在のスクリプト終了 [ 結果: True ]

Else

    #上記のチェックをパス出来ない場合、フィールド値の修正を求める

    カスタムダイアログを表示 [ タイトル: $FieldName; メッセージ: $InputValue & $ErrorMessage ; デフォルトボタン: 「修正」, 確定: 「いいえ」 ]

    現在のスクリプト終了 [ 結果: False ]

End If

Outcomes