annotate vendor/egulias/email-validator/EmailValidator/EmailParser.php @ 5:12f9dff5fda9 tip

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