You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.6 KiB
104 lines
2.6 KiB
<?php |
|
|
|
namespace Egulias\EmailValidator; |
|
|
|
use Egulias\EmailValidator\Exception\ExpectingATEXT; |
|
use Egulias\EmailValidator\Exception\NoLocalPart; |
|
use Egulias\EmailValidator\Parser\DomainPart; |
|
use Egulias\EmailValidator\Parser\LocalPart; |
|
use Egulias\EmailValidator\Warning\EmailTooLong; |
|
|
|
/** |
|
* EmailParser |
|
* |
|
* @author Eduardo Gulias Davis <me@egulias.com> |
|
*/ |
|
class EmailParser |
|
{ |
|
const EMAIL_MAX_LENGTH = 254; |
|
|
|
protected $warnings; |
|
protected $domainPart = ''; |
|
protected $localPart = ''; |
|
protected $lexer; |
|
protected $localPartParser; |
|
protected $domainPartParser; |
|
|
|
public function __construct(EmailLexer $lexer) |
|
{ |
|
$this->lexer = $lexer; |
|
$this->localPartParser = new LocalPart($this->lexer); |
|
$this->domainPartParser = new DomainPart($this->lexer); |
|
$this->warnings = new \SplObjectStorage(); |
|
} |
|
|
|
/** |
|
* @param $str |
|
* @return array |
|
*/ |
|
public function parse($str) |
|
{ |
|
$this->lexer->setInput($str); |
|
|
|
if (!$this->hasAtToken()) { |
|
throw new NoLocalPart(); |
|
} |
|
|
|
|
|
$this->localPartParser->parse($str); |
|
$this->domainPartParser->parse($str); |
|
|
|
$this->setParts($str); |
|
|
|
if ($this->lexer->hasInvalidTokens()) { |
|
throw new ExpectingATEXT(); |
|
} |
|
|
|
return array('local' => $this->localPart, 'domain' => $this->domainPart); |
|
} |
|
|
|
public function getWarnings() |
|
{ |
|
$localPartWarnings = $this->localPartParser->getWarnings(); |
|
$domainPartWarnings = $this->domainPartParser->getWarnings(); |
|
$this->warnings = array_merge($localPartWarnings, $domainPartWarnings); |
|
|
|
$this->addLongEmailWarning($this->localPart, $this->domainPart); |
|
|
|
return $this->warnings; |
|
} |
|
|
|
public function getParsedDomainPart() |
|
{ |
|
return $this->domainPart; |
|
} |
|
|
|
protected function setParts($email) |
|
{ |
|
$parts = explode('@', $email); |
|
$this->domainPart = $this->domainPartParser->getDomainPart(); |
|
$this->localPart = $parts[0]; |
|
} |
|
|
|
protected function hasAtToken() |
|
{ |
|
$this->lexer->moveNext(); |
|
$this->lexer->moveNext(); |
|
if ($this->lexer->token['type'] === EmailLexer::S_AT) { |
|
return false; |
|
} |
|
|
|
return true; |
|
} |
|
|
|
/** |
|
* @param string $localPart |
|
* @param string $parsedDomainPart |
|
*/ |
|
protected function addLongEmailWarning($localPart, $parsedDomainPart) |
|
{ |
|
if (strlen($localPart . '@' . $parsedDomainPart) > self::EMAIL_MAX_LENGTH) { |
|
$this->warnings[EmailTooLong::CODE] = new EmailTooLong(); |
|
} |
|
} |
|
}
|
|
|