是否有 Haskell 函式以標準格式決議電子郵件地址?例如:
parseEmailAddress "Jon Doe<[email protected]>"
會回傳類似的東西:
Address (Just "Jon Doe") "[email protected]"
我在mime-mail包中找不到執行此操作的函式。
uj5u.com熱心網友回復:
好的。這是我寫的。
{-# LANGUAGE NamedFieldPuns #-}
module Email (parseEmailAddress) where
import Text.Parsec (parse)
import Text.Parsec.Rfc2822 (NameAddr(..), name_addr)
import Network.Mail.Mime (Address(..))
import Data.Text (pack)
import Data.List (elem)
mapMaybe :: (a -> b) -> Maybe a -> Maybe b
mapMaybe _ Nothing = Nothing
mapMaybe f (Just a) = Just (f a)
-- | Given a string email address, spits out an Address record
parseEmailAddress :: String -> Maybe Address
parseEmailAddress str =
case parse name_addr "" addr of
Left _ ->
Nothing
Right (NameAddr { nameAddr_name, nameAddr_addr }) ->
Just (Address (mapMaybe pack nameAddr_name) (pack nameAddr_addr))
where
-- Standardize the email address
addr = if '<' `elem` str then str else "<" str ">"
然后,該函式將按如下方式作業:
parseEmailAddress "[email protected]" -- Just (Address Nothing "[email protected]")
parseEmailAddress "John Doe <[email protected]>" -- Just (Address (Just "John Doe") "[email protected]")
parseEmailAddress "johndoe" -- Nothing
uj5u.com熱心網友回復:
會不會像這樣作業:
parseEmailAddress xs =
case break (== '<') of
(mail, "") -> Address Nothing mail
(name, mail) -> Address (Just name) (init (tail mail))
這假定名稱不包含<字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/363861.html
