良い電子メール検証ルーチンを探した後、私はthis answer to a similar questionを見つけ、それが最も有望な候補のように見えることにしました。私はまた、PHPUnitのテストを建て電子メール検証が機能しない
class Email extends RegexMatch implements iface\Prop
{
const
/**
* Regular expression for validating email addresses
*
* This regex is meant to validate against RFC 5322 and was taken from
* a post on Stack Overflow regarding email validation (see the links)
*
* @link http://www.ietf.org/rfc/rfc5322.txt, https://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses/1917982#1917982
*/
PATTERN = '
/(?(DEFINE)
(?<address> (?&mailbox) | (?&group))
(?<mailbox> (?&name_addr) | (?&addr_spec))
(?<name_addr> (?&display_name)? (?&angle_addr))
(?<angle_addr> (?&CFWS)? < (?&addr_spec) > (?&CFWS)?)
(?<group> (?&display_name) : (?:(?&mailbox_list) | (?&CFWS))? ;
(?&CFWS)?)
(?<display_name> (?&phrase))
(?<mailbox_list> (?&mailbox) (?: , (?&mailbox))*)
(?<addr_spec> (?&local_part) \@ (?&domain))
(?<local_part> (?&dot_atom) | (?"ed_string))
(?<domain> (?&dot_atom) | (?&domain_literal))
(?<domain_literal> (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
\] (?&CFWS)?)
(?<dcontent> (?&dtext) | (?"ed_pair))
(?<dtext> (?&NO_WS_CTL) | [\x21-\x5a\x5e-\x7e])
(?<atext> (?&ALPHA) | (?&DIGIT) | [!#\$%&\'*+-\/=?^_`{|}~])
(?<atom> (?&CFWS)? (?&atext)+ (?&CFWS)?)
(?<dot_atom> (?&CFWS)? (?&dot_atom_text) (?&CFWS)?)
(?<dot_atom_text> (?&atext)+ (?: \. (?&atext)+)*)
(?<text> [\x01-\x09\x0b\x0c\x0e-\x7f])
(?<quoted_pair> \\ (?&text))
(?<qtext> (?&NO_WS_CTL) | [\x21\x23-\x5b\x5d-\x7e])
(?<qcontent> (?&qtext) | (?"ed_pair))
(?<quoted_string> (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
(?&FWS)? (?&DQUOTE) (?&CFWS)?)
(?<word> (?&atom) | (?"ed_string))
(?<phrase> (?&word)+)
# Folding white space
(?<FWS> (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
(?<ctext> (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
(?<ccontent> (?&ctext) | (?"ed_pair) | (?&comment))
(?<comment> \((?: (?&FWS)? (?&ccontent))* (?&FWS)? \))
(?<CFWS> (?: (?&FWS)? (?&comment))*
(?: (?:(?&FWS)? (?&comment)) | (?&FWS)))
# No whitespace control
(?<NO_WS_CTL> [\x01-\x08\x0b\x0c\x0e-\x1f\x7f])
(?<ALPHA> [A-Za-z])
(?<DIGIT> [0-9])
(?<CRLF> \x0d \x0a)
(?<DQUOTE> ")
(?<WSP> [\x20\x09])
)
(?&address)/x';
public function setConfig (array $config = array())
{
$config = array_merge ($config, array ('needle' => self::PATTERN));
return (parent::setConfig ($config));
}
public function isValid()
{
return ((is_null ($this -> getData()))
|| (parent::isValid()));
}
}
:私は、電子メールの検証のため、以下のクラス(それはから継承REGEXMATCHクラスは連想設定配列の「針」キーで提供される正規表現に対して文字列を検証)実装しましたさまざまなソース(主にWikipedia)から抽出された有効な電子メールアドレスと無効な電子メールアドレスのさまざまな置換に対してこのクラスを実行します。
クラスは多くの世俗的なケースで機能しているようですが、無効であると思われる電子メールをいくつか渡して問題が発生しています。私は、以下のそれらをリストアップしました:
much."more\ unusual"@example.com
(失敗し、有効であるために仮定)"(),:;<>[\]@example.com
(無効ことになって、渡し)just"not"[email protected]
(渡し、無効であると仮定)[email protected]@[email protected]
(通過し、無効であると想定)this\ is\"really\"not\\[email protected]
(通過し、無効であると想定)
PHPは正規表現を正しく解析しているようですが、エラー、警告、通知は出ません。また、他のすべてのテストケース(7つの有効なアドレスと2つの無効なもの)が合格または不合格になっているので、私のPHP(5.3.8)のバージョンがここで使用されている正規表現の構文をサポートしていないので、 。しかし、私は偽陽性と偽陰性の両方を持っているので、明らかに何か間違っています。いずれかの私のテストデータが間違っている(これは私が大部分はWikipediaから抜粋した)、正規表現は何らかの形で間違っています。
上記の正規表現は正しいですか?そうでない場合は、どのような修正を加える必要がありますか?それが正しい場合は、私のテストケースに何か問題がありますか?
EDIT:これは検証クラスで、電子メールアドレスだけを含む文字列を渡す必要があることは忘れてしまいました。私は非電子メールアドレスのデータ内に有効な電子メールアドレスを含む文字列を渡す必要はありません。私はあなたが^pattern_goes_here$
を使ってそれを行うことを知っていますが、この正規表現は、私が過去に働いたほとんどのものよりかなり進んでおり、^と$がどこに行くべきか分かりません。あなたもそれを助けることができたら、私はそれを感謝します。
あなたは使用できません: 'filter_var('[email protected] '、FILTER_VALIDATE_EMAIL)'? –
仕様が非常に大きいので、正規表現の電子メールバリデーターは非常に難しいことに注意してください!すべての可能なケースにマッチする単一の正規表現があるとは思わない。 – PeeHaa
@GordonM:あなたに関して編集します。区切り文字の直前と直後に、普通に行うように配置してください。 – PeeHaa