Eliomで入力値検査 (3) メールアドレスのチェック
よくある話、正規表現でメールアドレスっぽくない文字列を弾きたい.
- Eliom の, 正規表現で入力値を弾く param_type を生成する Eliom_parameters.regexp を使う
- OCamlには pcre-ocamlというPCREインタフェースがあるのでそれを使う.
ソース
(* どこかから拾ってきた メールアドレスっぽい正規表現 *) 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 (メールアドレスがマッチしない)))