annotate vendor/egulias/email-validator/src/Egulias/EmailValidator/EmailParser.php @ 7:848c88cfe644

More layout
author Chris Cannam
date Fri, 05 Jan 2018 13:59:44 +0000
parents 4c8ae668cc8c
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Egulias\EmailValidator;
Chris@0 4
Chris@0 5 use Egulias\EmailValidator\Parser\DomainPart;
Chris@0 6 use Egulias\EmailValidator\Parser\LocalPart;
Chris@0 7
Chris@0 8 /**
Chris@0 9 * EmailParser
Chris@0 10 *
Chris@0 11 * @author Eduardo Gulias Davis <me@egulias.com>
Chris@0 12 */
Chris@0 13 class EmailParser
Chris@0 14 {
Chris@0 15 const EMAIL_MAX_LENGTH = 254;
Chris@0 16
Chris@0 17 protected $warnings = array();
Chris@0 18 protected $domainPart = '';
Chris@0 19 protected $localPart = '';
Chris@0 20 protected $lexer;
Chris@0 21 protected $localPartParser;
Chris@0 22 protected $domainPartParser;
Chris@0 23
Chris@0 24 public function __construct(EmailLexer $lexer)
Chris@0 25 {
Chris@0 26 $this->lexer = $lexer;
Chris@0 27 $this->localPartParser = new LocalPart($this->lexer);
Chris@0 28 $this->domainPartParser = new DomainPart($this->lexer);
Chris@0 29 }
Chris@0 30
Chris@0 31 /**
Chris@0 32 * @param $str
Chris@0 33 * @return array
Chris@0 34 */
Chris@0 35 public function parse($str)
Chris@0 36 {
Chris@0 37 $this->lexer->setInput($str);
Chris@0 38
Chris@0 39 if (!$this->hasAtToken()) {
Chris@0 40 throw new \InvalidArgumentException('ERR_NOLOCALPART');
Chris@0 41 }
Chris@0 42
Chris@0 43
Chris@0 44 $this->localPartParser->parse($str);
Chris@0 45 $this->domainPartParser->parse($str);
Chris@0 46
Chris@0 47 $this->setParts($str);
Chris@0 48
Chris@0 49 if ($this->lexer->hasInvalidTokens()) {
Chris@0 50 throw new \InvalidArgumentException('ERR_INVALID_ATEXT');
Chris@0 51 }
Chris@0 52
Chris@0 53 return array('local' => $this->localPart, 'domain' => $this->domainPart);
Chris@0 54 }
Chris@0 55
Chris@0 56 public function getWarnings()
Chris@0 57 {
Chris@0 58 $localPartWarnings = $this->localPartParser->getWarnings();
Chris@0 59 $domainPartWarnings = $this->domainPartParser->getWarnings();
Chris@0 60
Chris@0 61 $this->warnings = array_merge($localPartWarnings, $domainPartWarnings);
Chris@0 62 $this->addLongEmailWarning($this->localPart, $this->domainPart);
Chris@0 63
Chris@0 64 return $this->warnings;
Chris@0 65 }
Chris@0 66
Chris@0 67 public function getParsedDomainPart()
Chris@0 68 {
Chris@0 69 return $this->domainPart;
Chris@0 70 }
Chris@0 71
Chris@0 72 protected function setParts($email)
Chris@0 73 {
Chris@0 74 $parts = explode('@', $email);
Chris@0 75 $this->domainPart = $this->domainPartParser->getDomainPart();
Chris@0 76 $this->localPart = $parts[0];
Chris@0 77 }
Chris@0 78
Chris@0 79 protected function hasAtToken()
Chris@0 80 {
Chris@0 81 $this->lexer->moveNext();
Chris@0 82 $this->lexer->moveNext();
Chris@0 83 if ($this->lexer->token['type'] === EmailLexer::S_AT) {
Chris@0 84 return false;
Chris@0 85 }
Chris@0 86
Chris@0 87 return true;
Chris@0 88 }
Chris@0 89
Chris@0 90 /**
Chris@0 91 * @param string $localPart
Chris@0 92 * @param string $parsedDomainPart
Chris@0 93 */
Chris@0 94 protected function addLongEmailWarning($localPart, $parsedDomainPart)
Chris@0 95 {
Chris@0 96 if (strlen($localPart . '@' . $parsedDomainPart) > self::EMAIL_MAX_LENGTH) {
Chris@0 97 $this->warnings[] = EmailValidator::RFC5322_TOOLONG;
Chris@0 98 }
Chris@0 99 }
Chris@0 100 }