private function contextHtmlTag() { $matches = $this->match('~ (?P<end>\\s?/?>)([ \\t]*\\n)?| ## end of HTML tag (?P<macro>' . $this->delimiters[0] . ')| \\s*(?P<attr>[^\\s"\'>/={]+)(?:\\s*=\\s*(?P<value>["\']|[^\\s"\'=<>`{]+))? ## beginning of HTML attribute ~xsi'); if (!empty($matches['end'])) { // end of HTML tag /> $this->addToken(Token::HTML_TAG_END, $matches[0]); $this->setContext(!$this->xmlMode && in_array($this->lastHtmlTag, ['script', 'style'], TRUE) ? self::CONTEXT_HTML_CDATA : self::CONTEXT_HTML_TEXT); } elseif (isset($matches['attr']) && $matches['attr'] !== '') { // HTML attribute $token = $this->addToken(Token::HTML_ATTRIBUTE_BEGIN, $matches[0]); $token->name = $matches['attr']; $token->value = isset($matches['value']) ? $matches['value'] : ''; if ($token->value === '"' || $token->value === "'") { // attribute = "' if (Helpers::startsWith($token->name, self::N_PREFIX)) { $token->value = ''; if ($m = $this->match('~(.*?)' . $matches['value'] . '~xsi')) { $token->value = $m[1]; $token->text .= $m[0]; } } else { $this->setContext(self::CONTEXT_HTML_ATTRIBUTE, $matches['value']); } } } else { return $this->processMacro($matches); } }