radarrplexorganizrnginxsonarrdashboardserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpc
		
		
		
		
			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.
		
		
		
		
		
			
		
			
				
					
					
						
							138 lines
						
					
					
						
							4.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							138 lines
						
					
					
						
							4.4 KiB
						
					
					
				| <?php | |
| 
 | |
| namespace Egulias\EmailValidator\Parser; | |
| 
 | |
| use Egulias\EmailValidator\Exception\DotAtEnd; | |
| use Egulias\EmailValidator\Exception\DotAtStart; | |
| use Egulias\EmailValidator\EmailLexer; | |
| use Egulias\EmailValidator\EmailValidator; | |
| use Egulias\EmailValidator\Exception\ExpectingAT; | |
| use Egulias\EmailValidator\Exception\ExpectingATEXT; | |
| use Egulias\EmailValidator\Exception\UnclosedQuotedString; | |
| use Egulias\EmailValidator\Exception\UnopenedComment; | |
| use Egulias\EmailValidator\Warning\CFWSWithFWS; | |
| use Egulias\EmailValidator\Warning\LocalTooLong; | |
| 
 | |
| class LocalPart extends Parser | |
| { | |
|     public function parse($localPart) | |
|     { | |
|         $parseDQuote = true; | |
|         $closingQuote = false; | |
|         $openedParenthesis = 0; | |
| 
 | |
|         while ($this->lexer->token['type'] !== EmailLexer::S_AT && $this->lexer->token) { | |
|             if ($this->lexer->token['type'] === EmailLexer::S_DOT && !$this->lexer->getPrevious()) { | |
|                 throw new DotAtStart(); | |
|             } | |
| 
 | |
|             $closingQuote = $this->checkDQUOTE($closingQuote); | |
|             if ($closingQuote && $parseDQuote) { | |
|                 $parseDQuote = $this->parseDoubleQuote(); | |
|             } | |
| 
 | |
|             if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) { | |
|                 $this->parseComments(); | |
|                 $openedParenthesis += $this->getOpenedParenthesis(); | |
|             } | |
|             if ($this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS) { | |
|                 if ($openedParenthesis === 0) { | |
|                     throw new UnopenedComment(); | |
|                 } else { | |
|                     $openedParenthesis--; | |
|                 } | |
|             } | |
| 
 | |
|             $this->checkConsecutiveDots(); | |
| 
 | |
|             if ($this->lexer->token['type'] === EmailLexer::S_DOT && | |
|                 $this->lexer->isNextToken(EmailLexer::S_AT) | |
|             ) { | |
|                 throw new DotAtEnd(); | |
|             } | |
| 
 | |
|             $this->warnEscaping(); | |
|             $this->isInvalidToken($this->lexer->token, $closingQuote); | |
| 
 | |
|             if ($this->isFWS()) { | |
|                 $this->parseFWS(); | |
|             } | |
| 
 | |
|             $this->lexer->moveNext(); | |
|         } | |
| 
 | |
|         $prev = $this->lexer->getPrevious(); | |
|         if (strlen($prev['value']) > LocalTooLong::LOCAL_PART_LENGTH) { | |
|             $this->warnings[LocalTooLong::CODE] = new LocalTooLong(); | |
|         } | |
|     } | |
| 
 | |
|     protected function parseDoubleQuote() | |
|     { | |
|         $parseAgain = true; | |
|         $special = array( | |
|             EmailLexer::S_CR => true, | |
|             EmailLexer::S_HTAB => true, | |
|             EmailLexer::S_LF => true | |
|         ); | |
| 
 | |
|         $invalid = array( | |
|             EmailLexer::C_NUL => true, | |
|             EmailLexer::S_HTAB => true, | |
|             EmailLexer::S_CR => true, | |
|             EmailLexer::S_LF => true | |
|         ); | |
|         $setSpecialsWarning = true; | |
| 
 | |
|         $this->lexer->moveNext(); | |
| 
 | |
|         while ($this->lexer->token['type'] !== EmailLexer::S_DQUOTE && $this->lexer->token) { | |
|             $parseAgain = false; | |
|             if (isset($special[$this->lexer->token['type']]) && $setSpecialsWarning) { | |
|                 $this->warnings[CFWSWithFWS::CODE] = new CFWSWithFWS(); | |
|                 $setSpecialsWarning = false; | |
|             } | |
|             if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH && $this->lexer->isNextToken(EmailLexer::S_DQUOTE)) { | |
|                 $this->lexer->moveNext(); | |
|             } | |
| 
 | |
|             $this->lexer->moveNext(); | |
| 
 | |
|             if (!$this->escaped() && isset($invalid[$this->lexer->token['type']])) { | |
|                 throw new ExpectingATEXT(); | |
|             } | |
|         } | |
| 
 | |
|         $prev = $this->lexer->getPrevious(); | |
| 
 | |
|         if ($prev['type'] === EmailLexer::S_BACKSLASH) { | |
|             if (!$this->checkDQUOTE(false)) { | |
|                 throw new UnclosedQuotedString(); | |
|             } | |
|         } | |
| 
 | |
|         if (!$this->lexer->isNextToken(EmailLexer::S_AT) && $prev['type'] !== EmailLexer::S_BACKSLASH) { | |
|             throw new ExpectingAT(); | |
|         } | |
| 
 | |
|         return $parseAgain; | |
|     } | |
| 
 | |
|     protected function isInvalidToken($token, $closingQuote) | |
|     { | |
|         $forbidden = array( | |
|             EmailLexer::S_COMMA, | |
|             EmailLexer::S_CLOSEBRACKET, | |
|             EmailLexer::S_OPENBRACKET, | |
|             EmailLexer::S_GREATERTHAN, | |
|             EmailLexer::S_LOWERTHAN, | |
|             EmailLexer::S_COLON, | |
|             EmailLexer::S_SEMICOLON, | |
|             EmailLexer::INVALID | |
|         ); | |
| 
 | |
|         if (in_array($token['type'], $forbidden) && !$closingQuote) { | |
|             throw new ExpectingATEXT(); | |
|         } | |
|     } | |
| }
 | |
| 
 |