105 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Egulias\EmailValidator;
 | |
| 
 | |
| use Egulias\EmailValidator\Exception\ExpectingATEXT;
 | |
| use Egulias\EmailValidator\Exception\NoLocalPart;
 | |
| use Egulias\EmailValidator\Parser\DomainPart;
 | |
| use Egulias\EmailValidator\Parser\LocalPart;
 | |
| use Egulias\EmailValidator\Warning\EmailTooLong;
 | |
| 
 | |
| /**
 | |
|  * EmailParser
 | |
|  *
 | |
|  * @author Eduardo Gulias Davis <me@egulias.com>
 | |
|  */
 | |
| class EmailParser
 | |
| {
 | |
|     const EMAIL_MAX_LENGTH = 254;
 | |
| 
 | |
|     protected $warnings;
 | |
|     protected $domainPart = '';
 | |
|     protected $localPart = '';
 | |
|     protected $lexer;
 | |
|     protected $localPartParser;
 | |
|     protected $domainPartParser;
 | |
| 
 | |
|     public function __construct(EmailLexer $lexer)
 | |
|     {
 | |
|         $this->lexer = $lexer;
 | |
|         $this->localPartParser = new LocalPart($this->lexer);
 | |
|         $this->domainPartParser = new DomainPart($this->lexer);
 | |
|         $this->warnings = new \SplObjectStorage();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param $str
 | |
|      * @return array
 | |
|      */
 | |
|     public function parse($str)
 | |
|     {
 | |
|         $this->lexer->setInput($str);
 | |
| 
 | |
|         if (!$this->hasAtToken()) {
 | |
|             throw new NoLocalPart();
 | |
|         }
 | |
| 
 | |
| 
 | |
|         $this->localPartParser->parse($str);
 | |
|         $this->domainPartParser->parse($str);
 | |
| 
 | |
|         $this->setParts($str);
 | |
| 
 | |
|         if ($this->lexer->hasInvalidTokens()) {
 | |
|             throw new ExpectingATEXT();
 | |
|         }
 | |
| 
 | |
|         return array('local' => $this->localPart, 'domain' => $this->domainPart);
 | |
|     }
 | |
| 
 | |
|     public function getWarnings()
 | |
|     {
 | |
|         $localPartWarnings = $this->localPartParser->getWarnings();
 | |
|         $domainPartWarnings = $this->domainPartParser->getWarnings();
 | |
|         $this->warnings = array_merge($localPartWarnings, $domainPartWarnings);
 | |
| 
 | |
|         $this->addLongEmailWarning($this->localPart, $this->domainPart);
 | |
| 
 | |
|         return $this->warnings;
 | |
|     }
 | |
| 
 | |
|     public function getParsedDomainPart()
 | |
|     {
 | |
|         return $this->domainPart;
 | |
|     }
 | |
| 
 | |
|     protected function setParts($email)
 | |
|     {
 | |
|         $parts = explode('@', $email);
 | |
|         $this->domainPart = $this->domainPartParser->getDomainPart();
 | |
|         $this->localPart = $parts[0];
 | |
|     }
 | |
| 
 | |
|     protected function hasAtToken()
 | |
|     {
 | |
|         $this->lexer->moveNext();
 | |
|         $this->lexer->moveNext();
 | |
|         if ($this->lexer->token['type'] === EmailLexer::S_AT) {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $localPart
 | |
|      * @param string $parsedDomainPart
 | |
|      */
 | |
|     protected function addLongEmailWarning($localPart, $parsedDomainPart)
 | |
|     {
 | |
|         if (strlen($localPart . '@' . $parsedDomainPart) > self::EMAIL_MAX_LENGTH) {
 | |
|             $this->warnings[EmailTooLong::CODE] = new EmailTooLong();
 | |
|         }
 | |
|     }
 | |
| }
 | 
