3 namespace Egulias\EmailValidator;
5 use Egulias\EmailValidator\Parser\DomainPart;
6 use Egulias\EmailValidator\Parser\LocalPart;
11 * @author Eduardo Gulias Davis <me@egulias.com>
15 const EMAIL_MAX_LENGTH = 254;
17 protected $warnings = array();
18 protected $domainPart = '';
19 protected $localPart = '';
21 protected $localPartParser;
22 protected $domainPartParser;
24 public function __construct(EmailLexer $lexer)
26 $this->lexer = $lexer;
27 $this->localPartParser = new LocalPart($this->lexer);
28 $this->domainPartParser = new DomainPart($this->lexer);
35 public function parse($str)
37 $this->lexer->setInput($str);
39 if (!$this->hasAtToken()) {
40 throw new \InvalidArgumentException('ERR_NOLOCALPART');
44 $this->localPartParser->parse($str);
45 $this->domainPartParser->parse($str);
47 $this->setParts($str);
49 if ($this->lexer->hasInvalidTokens()) {
50 throw new \InvalidArgumentException('ERR_INVALID_ATEXT');
53 return array('local' => $this->localPart, 'domain' => $this->domainPart);
56 public function getWarnings()
58 $localPartWarnings = $this->localPartParser->getWarnings();
59 $domainPartWarnings = $this->domainPartParser->getWarnings();
61 $this->warnings = array_merge($localPartWarnings, $domainPartWarnings);
62 $this->addLongEmailWarning($this->localPart, $this->domainPart);
64 return $this->warnings;
67 public function getParsedDomainPart()
69 return $this->domainPart;
72 protected function setParts($email)
74 $parts = explode('@', $email);
75 $this->domainPart = $this->domainPartParser->getDomainPart();
76 $this->localPart = $parts[0];
79 protected function hasAtToken()
81 $this->lexer->moveNext();
82 $this->lexer->moveNext();
83 if ($this->lexer->token['type'] === EmailLexer::S_AT) {
91 * @param string $localPart
92 * @param string $parsedDomainPart
94 protected function addLongEmailWarning($localPart, $parsedDomainPart)
96 if (strlen($localPart . '@' . $parsedDomainPart) > self::EMAIL_MAX_LENGTH) {
97 $this->warnings[] = EmailValidator::RFC5322_TOOLONG;