public function parse(string $source): array
    {
        //Cleaning list of already parsed tokens
        $this->tokens = [];

        if ($this->isolatePHP) {
            $source = $this->isolator->isolatePHP($source);
        }

        $quotas = '';
        $buffer = '';

        $length = strlen($source);
        $position = self::POSITION_PLAIN_TEXT;
        for ($pointer = 0; $pointer < $length; $pointer++) {
            $char = $source[$pointer];
            switch ($char) {
                case '<':
                    if ($position == self::POSITION_IN_QUOTAS) {
                        $buffer .= $char;
                        break;
                    }

                    if ($position == self::POSITION_IN_TAG) {
                        $buffer = '<' . $buffer;
                    }

                    //Handling previous token
                    $this->handleToken(self::PLAIN_TEXT, $buffer);

                    //We are in tag now
                    $position = self::POSITION_IN_TAG;
                    $buffer = '';
                    break;
                case '>':
                    if ($position != self::POSITION_IN_TAG) {
                        $buffer .= $char;
                        break;
                    }

                    //Token ended
                    $this->handleToken(null, $buffer);

                    //We are in a plain text now
                    $position = self::POSITION_PLAIN_TEXT;
                    $buffer = '';
                    break;
                case '"':
                    //no break
                case "'":
                    if ($position == self::POSITION_IN_TAG) {
                        //Jumping into argument
                        $position = self::POSITION_IN_QUOTAS;
                        $quotas = $char;
                    } elseif ($position == self::POSITION_IN_QUOTAS && $char == $quotas) {
                        //Jumping from argument
                        $position = self::POSITION_IN_TAG;
                        $quotas = '';
                    }
                default:
                    //Checking for invalid characters in tag name or arguments
                    if ($position == self::POSITION_IN_TAG) {
                        if (!preg_match('/[a-z0-9 \._\-="\':\/\r\n\t]/i', $char)) {
                            $buffer = '<' . $buffer;
                            $position = self::POSITION_PLAIN_TEXT;
                        }
                    }
                    $buffer .= $char;
            }
        }

        $this->handleToken(self::PLAIN_TEXT, $buffer);

        return $this->tokens;
    }
public function parse(string $source): array
    {
        //Cleaning list of already parsed tokens
        $this->tokens = [];

        if ($this->isolatePHP) {
            $source = $this->isolator->isolatePHP($source);
        }

        $quotas = '';
        $buffer = '';

        $length = strlen($source);
        $position = self::POSITION_PLAIN_TEXT;
        for ($pointer = 0; $pointer < $length; $pointer++) {
            $char = $source[$pointer];
            switch ($char) {
                case '<':
                    if ($position == self::POSITION_IN_QUOTAS) {
                        $buffer .= $char;
                        break;
                    }

                    if ($position == self::POSITION_IN_TAG) {
                        $buffer = '<' . $buffer;
                    }

                    //Handling previous token
                    $this->handleToken(self::PLAIN_TEXT, $buffer);

                    //We are in tag now
                    $position = self::POSITION_IN_TAG;
                    $buffer = '';
                    break;
                case '>':
                    if ($position != self::POSITION_IN_TAG) {
                        $buffer .= $char;
                        break;
                    }

                    //Token ended
                    $this->handleToken(null, $buffer);

                    //We are in a plain text now
                    $position = self::POSITION_PLAIN_TEXT;
                    $buffer = '';
                    break;
                case '"':
                    //no break
                case "'":
                    if ($position == self::POSITION_IN_TAG) {
                        //Jumping into argument
                        $position = self::POSITION_IN_QUOTAS;
                        $quotas = $char;
                    } elseif ($position == self::POSITION_IN_QUOTAS && $char == $quotas) {
                        //Jumping from argument
                        $position = self::POSITION_IN_TAG;
                        $quotas = '';
                    }
                default:
                    //Checking for invalid characters in tag name or arguments
                    if ($position == self::POSITION_IN_TAG) {
                        if (!preg_match('/[a-z0-9 \._\-="\':\/\r\n\t]/i', $char)) {
                            $buffer = '<' . $buffer;
                            $position = self::POSITION_PLAIN_TEXT;
                        }
                    }
                    $buffer .= $char;
            }
        }

        $this->handleToken(self::PLAIN_TEXT, $buffer);

        return $this->tokens;
    }
public function parse ( string $ source ) : array { //Cleaning list of already parsed tokens $ this -> tokens = [ ] ; if ( $ this -> isolatePHP ) { $ source = $ this -> isolator -> isolatePHP ( $ source ) ; } $ quotas = '' ; $ buffer = '' ; $ length = strlen ( $ source ) ; $ position = self :: POSITION_PLAIN_TEXT ; for ( $ pointer = 0 ; $ pointer < $ length ; $ pointer ++ ) { $ char = $ source [ $ pointer ] ; switch ( $ char ) { case '<' : if ( $ position == self :: POSITION_IN_QUOTAS ) { $ buffer .= $ char ; break ; } if ( $ position == self :: POSITION_IN_TAG ) { $ buffer = '<' . $ buffer ; } //Handling previous token $ this -> handleToken ( self :: PLAIN_TEXT , $ buffer ) ; //We are in tag now $ position = self :: POSITION_IN_TAG ; $ buffer = '' ; break ; case '>' : if ( $ position != self :: POSITION_IN_TAG ) { $ buffer .= $ char ; break ; } //Token ended $ this -> handleToken ( null , $ buffer ) ; //We are in a plain text now $ position = self :: POSITION_PLAIN_TEXT ; $ buffer = '' ; break ; case '"' : //no break case "'" : if ( $ position == self :: POSITION_IN_TAG ) { //Jumping into argument $ position = self :: POSITION_IN_QUOTAS ; $ quotas = $ char ; } elseif ( $ position == self :: POSITION_IN_QUOTAS && $ char == $ quotas ) { //Jumping from argument $ position = self :: POSITION_IN_TAG ; $ quotas = '' ; } default : //Checking for invalid characters in tag name or arguments if ( $ position == self :: POSITION_IN_TAG ) { if ( ! preg_match ( '/[a-z0-9 \._\-="\':\/\r\n\t]/i' , $ char ) ) { $ buffer = '<' . $ buffer ; $ position = self :: POSITION_PLAIN_TEXT ; } } $ buffer .= $ char ; } } $ this -> handleToken ( self :: PLAIN_TEXT , $ buffer ) ; return $ this -> tokens ; }
Parse HTML content and return it's tokens.

@param string $source HTML source.

@return array
Parse HTML content and return it s tokens .