Eliomで入力値検査 (3) メールアドレスのチェック

よくある話、正規表現でメールアドレスっぽくない文字列を弾きたい.

ソース

(* どこかから拾ってきた メールアドレスっぽい正規表現 *)
let emailregex = Pcre.regexp "^(?:(?:(?:(?:[a-zA-Z0-9_!#\\$\\%&'*+/=?\\^`{}~|\\-]+)(?:\\.(?:[a-zA-Z0-9_!#\\$\\%&'*+/=?\\^`{}~|\\-]+))*)|(?:\"(?:\\\\[^\\r\\n]|[^\\\\\"])*\")))\\@(?:(?:(?:(?:[a-zA-Z0-9_!#\\$\\%&'*+/=?\\^`{}~|\\-]+)(?:\\.(?:[a-zA-Z0-9_!#\\$\\%&'*+/=?\\^`{}~|\\-]+))*)|(?:\\[(?:\\\\\\S|[\\x21-\\x5a\\x5e-\\x7e])*\\])))$"

(* メールアドレスのparam_typeを構築する関数 *)
let email s = Eliom_parameters.regexp emailregex "$0" s

(* メールアドレスを確認のため2つ受け取るサービス *)
let emailregister = 
  new_service 
    ~path:["emailregister"] 
    ~get_params:(email "email" ** email "confirm")  (* 受け取るリクエストパラメータは email と confirm の 2つ *)
    ()

(* サービスの登録 *)
let _ =
  register 
    ~service:emailregister 
    ~error_handler:(fun sp exns -> Lwt.return (メールアドレスっぽくない文字列が来た))
    (fun sp (email1, email2) _ -> 
        Lwt.return (if email1=email2 
          then (メールアドレスがマッチ)
          else (メールアドレスがマッチしない)))