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 }
|