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