Chris@0: Chris@0: */ Chris@0: class EmailParser Chris@0: { Chris@0: const EMAIL_MAX_LENGTH = 254; Chris@0: Chris@0: protected $warnings = array(); Chris@0: protected $domainPart = ''; Chris@0: protected $localPart = ''; Chris@0: protected $lexer; Chris@0: protected $localPartParser; Chris@0: protected $domainPartParser; Chris@0: Chris@0: public function __construct(EmailLexer $lexer) Chris@0: { Chris@0: $this->lexer = $lexer; Chris@0: $this->localPartParser = new LocalPart($this->lexer); Chris@0: $this->domainPartParser = new DomainPart($this->lexer); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param $str Chris@0: * @return array Chris@0: */ Chris@0: public function parse($str) Chris@0: { Chris@0: $this->lexer->setInput($str); Chris@0: Chris@0: if (!$this->hasAtToken()) { Chris@0: throw new \InvalidArgumentException('ERR_NOLOCALPART'); Chris@0: } Chris@0: Chris@0: Chris@0: $this->localPartParser->parse($str); Chris@0: $this->domainPartParser->parse($str); Chris@0: Chris@0: $this->setParts($str); Chris@0: Chris@0: if ($this->lexer->hasInvalidTokens()) { Chris@0: throw new \InvalidArgumentException('ERR_INVALID_ATEXT'); Chris@0: } Chris@0: Chris@0: return array('local' => $this->localPart, 'domain' => $this->domainPart); Chris@0: } Chris@0: Chris@0: public function getWarnings() Chris@0: { Chris@0: $localPartWarnings = $this->localPartParser->getWarnings(); Chris@0: $domainPartWarnings = $this->domainPartParser->getWarnings(); Chris@0: Chris@0: $this->warnings = array_merge($localPartWarnings, $domainPartWarnings); Chris@0: $this->addLongEmailWarning($this->localPart, $this->domainPart); Chris@0: Chris@0: return $this->warnings; Chris@0: } Chris@0: Chris@0: public function getParsedDomainPart() Chris@0: { Chris@0: return $this->domainPart; Chris@0: } Chris@0: Chris@0: protected function setParts($email) Chris@0: { Chris@0: $parts = explode('@', $email); Chris@0: $this->domainPart = $this->domainPartParser->getDomainPart(); Chris@0: $this->localPart = $parts[0]; Chris@0: } Chris@0: Chris@0: protected function hasAtToken() Chris@0: { Chris@0: $this->lexer->moveNext(); Chris@0: $this->lexer->moveNext(); Chris@0: if ($this->lexer->token['type'] === EmailLexer::S_AT) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: return true; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $localPart Chris@0: * @param string $parsedDomainPart Chris@0: */ Chris@0: protected function addLongEmailWarning($localPart, $parsedDomainPart) Chris@0: { Chris@0: if (strlen($localPart . '@' . $parsedDomainPart) > self::EMAIL_MAX_LENGTH) { Chris@0: $this->warnings[] = EmailValidator::RFC5322_TOOLONG; Chris@0: } Chris@0: } Chris@0: }