annotate vendor/egulias/email-validator/EmailValidator/EmailParser.php @ 19:fa3358dc1485 tip

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