/** * Detect and parse closing tag * * Pre-offset: any * Post-offset: after closing tag or reverted * * @param StringReader $input input * @param bool $getToken get token instead of true, null instead of false and do not revert 1/0 * @return array|bool token/true or null/false (= not detected) */ protected function parseClosingTag(StringReader $input, $getToken = false) { // are tags defined? if (null === $this->tags) { return $getToken ? null : false; } // check first character if ($input->char !== $this->tags[$input->args['tag_id']][2][0]) { return $getToken ? null : false; } // check other characters $offset = 0; $input->pushState(); while (!$input->end) { if ($input->char === $this->tags[$input->args['tag_id']][2][$offset]) { ++$offset; if ($offset === $this->tags[$input->args['tag_id']][3]) { // tag detected if ($getToken) { $input->popState(); $token = $this->token(self::T_TAG, $input->line, $this->tags[$input->args['tag_id']][2]); $input->eat(); return $token; } else { $input->revertState(); return true; } } } else { break; } $input->eat(); } // no detection $input->revertState(); return $getToken ? null : false; }