HumanNameParser_Parser::parse PHP Method

parse() private method

Sequentially captures each name-part, working in from the ends and trimming the namestring as it goes.
private parse ( )
    private function parse()
    {
        $suffixes = implode("\\.*|", $this->suffixes) . "\\.*";
        // each suffix gets a "\.*" behind it.
        $prefixes = implode(" |", $this->prefixes) . " ";
        // each prefix gets a " " behind it.
        // The regex use is a bit tricky.  *Everything* matched by the regex will be replaced,
        //	but you can select a particular parenthesized submatch to be returned.
        //	Also, note that each regex requres that the preceding ones have been run, and matches chopped out.
        $nicknamesRegex = "/ ('|\"|\\(\"*'*)(.+?)('|\"|\"*'*\\)) /";
        // names that starts or end w/ an apostrophe break this
        $suffixRegex = "/,* *({$suffixes})\$/";
        $lastRegex = "/(?!^)\\b([^ ]+ y |{$prefixes})*[^ ]+\$/";
        $leadingInitRegex = "/^(.\\.*)(?= \\p{L}{2})/";
        // note the lookahead, which isn't returned or replaced
        $firstRegex = "/^[^ ]+/";
        //
        // get nickname, if there is one
        $this->nicknames = $this->name->chopWithRegex($nicknamesRegex, 2);
        // get suffix, if there is one
        $this->suffix = $this->name->chopWithRegex($suffixRegex, 1);
        // flip the before-comma and after-comma parts of the name
        $this->name->flip(",");
        // get the last name
        $this->last = $this->name->chopWithRegex($lastRegex, 0);
        if (!$this->last) {
            throw new Exception("Couldn't find a last name in '{$this->name->getStr()}'.");
        }
        // get the first initial, if there is one
        $this->leadingInit = $this->name->chopWithRegex($leadingInitRegex, 1);
        // get the first name
        $this->first = $this->name->chopWithRegex($firstRegex, 0);
        if (!$this->first) {
            throw new Exception("Couldn't find a first name in '{$this->name->getStr()}'");
        }
        // if anything's left, that's the middle name
        $this->middle = $this->name->getStr();
        return true;
    }