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