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