mirror of
https://github.com/egulias/EmailValidator.git
synced 2026-09-16 04:56:47 +00:00
8e526a57c1
* scafolding for MessageID validation * Improve domain valid tokens * Improved EmailParser to remove leaked logic. User of lexer recorder within parsers. * MessageIDParser passing tests. * change left for right, which is the right one * psaml errors * Better naming * comments are not allowed in IDLeft for message-id * Suppress psalm inheritance over tokens and dependencies * Update src/Parser.php Co-authored-by: Alexander M. Turek <me@derrabus.de> * Update src/Parser.php Co-authored-by: Alexander M. Turek <me@derrabus.de> * improve parser from comments Co-authored-by: Alexander M. Turek <me@derrabus.de>
92 lines
2.4 KiB
PHP
92 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace Egulias\EmailValidator;
|
|
|
|
use Egulias\EmailValidator\EmailLexer;
|
|
use Egulias\EmailValidator\Result\Result;
|
|
use Egulias\EmailValidator\Parser\LocalPart;
|
|
use Egulias\EmailValidator\Parser\DomainPart;
|
|
use Egulias\EmailValidator\Result\ValidEmail;
|
|
use Egulias\EmailValidator\Result\InvalidEmail;
|
|
use Egulias\EmailValidator\Warning\EmailTooLong;
|
|
use Egulias\EmailValidator\Result\Reason\NoLocalPart;
|
|
|
|
class EmailParser extends Parser
|
|
{
|
|
const EMAIL_MAX_LENGTH = 254;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $domainPart = '';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $localPart = '';
|
|
|
|
public function parse(string $str) : Result
|
|
{
|
|
$result = parent::parse($str);
|
|
|
|
$this->addLongEmailWarning($this->localPart, $this->domainPart);
|
|
|
|
return $result;
|
|
}
|
|
|
|
protected function preLeftParsing(): Result
|
|
{
|
|
if (!$this->hasAtToken()) {
|
|
return new InvalidEmail(new NoLocalPart(), $this->lexer->token["value"]);
|
|
}
|
|
return new ValidEmail();
|
|
}
|
|
|
|
protected function parseLeftFromAt(): Result
|
|
{
|
|
return $this->processLocalPart();
|
|
}
|
|
|
|
protected function parseRightFromAt(): Result
|
|
{
|
|
return $this->processDomainPart();
|
|
}
|
|
|
|
private function processLocalPart() : Result
|
|
{
|
|
$localPartParser = new LocalPart($this->lexer);
|
|
$localPartResult = $localPartParser->parse();
|
|
$this->localPart = $localPartParser->localPart();
|
|
$this->warnings = array_merge($localPartParser->getWarnings(), $this->warnings);
|
|
|
|
return $localPartResult;
|
|
}
|
|
|
|
private function processDomainPart() : Result
|
|
{
|
|
$domainPartParser = new DomainPart($this->lexer);
|
|
$domainPartResult = $domainPartParser->parse();
|
|
$this->domainPart = $domainPartParser->domainPart();
|
|
$this->warnings = array_merge($domainPartParser->getWarnings(), $this->warnings);
|
|
|
|
return $domainPartResult;
|
|
}
|
|
|
|
public function getDomainPart() : string
|
|
{
|
|
return $this->domainPart;
|
|
}
|
|
|
|
public function getLocalPart() : string
|
|
{
|
|
return $this->localPart;
|
|
}
|
|
|
|
private function addLongEmailWarning(string $localPart, string $parsedDomainPart) : void
|
|
{
|
|
if (strlen($localPart . '@' . $parsedDomainPart) > self::EMAIL_MAX_LENGTH) {
|
|
$this->warnings[EmailTooLong::CODE] = new EmailTooLong();
|
|
}
|
|
}
|
|
}
|