Parser.php 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace Egulias\EmailValidator;
  3. use Egulias\EmailValidator\Result\Result;
  4. use Egulias\EmailValidator\Result\ValidEmail;
  5. use Egulias\EmailValidator\Result\InvalidEmail;
  6. use Egulias\EmailValidator\Result\Reason\ExpectingATEXT;
  7. abstract class Parser
  8. {
  9. /**
  10. * @var Warning\Warning[]
  11. */
  12. protected $warnings = [];
  13. /**
  14. * @var EmailLexer
  15. */
  16. protected $lexer;
  17. /**
  18. * id-left "@" id-right
  19. */
  20. abstract protected function parseRightFromAt(): Result;
  21. abstract protected function parseLeftFromAt(): Result;
  22. abstract protected function preLeftParsing(): Result;
  23. public function __construct(EmailLexer $lexer)
  24. {
  25. $this->lexer = $lexer;
  26. }
  27. public function parse(string $str): Result
  28. {
  29. $this->lexer->setInput($str);
  30. if ($this->lexer->hasInvalidTokens()) {
  31. return new InvalidEmail(new ExpectingATEXT("Invalid tokens found"), $this->lexer->current->value);
  32. }
  33. $preParsingResult = $this->preLeftParsing();
  34. if ($preParsingResult->isInvalid()) {
  35. return $preParsingResult;
  36. }
  37. $localPartResult = $this->parseLeftFromAt();
  38. if ($localPartResult->isInvalid()) {
  39. return $localPartResult;
  40. }
  41. $domainPartResult = $this->parseRightFromAt();
  42. if ($domainPartResult->isInvalid()) {
  43. return $domainPartResult;
  44. }
  45. return new ValidEmail();
  46. }
  47. /**
  48. * @return Warning\Warning[]
  49. */
  50. public function getWarnings(): array
  51. {
  52. return $this->warnings;
  53. }
  54. protected function hasAtToken(): bool
  55. {
  56. $this->lexer->moveNext();
  57. $this->lexer->moveNext();
  58. return !$this->lexer->current->isA(EmailLexer::S_AT);
  59. }
  60. }