Subversion-Projekte lars-tiefland.laravel_shop

Revision

Zur aktuellen Revision | Details | Letzte Änderung | Log anzeigen | RSS feed

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