nginxsonarrradarrplexorganizrdashboardbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbget
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							104 lines
						
					
					
						
							2.6 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							104 lines
						
					
					
						
							2.6 KiB
						
					
					
				
								<?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();
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 |