code: public static function parseTag($tag)
      {
          $regexTag = '#<([^\s>]+)([^>]*)>(.*)</\\1>#is';
          $regexTag2 = '#^<(?:\/\s*)?([^\s>]+)(.*?)\/?>$#s';
          $tag = \trim($tag);
          if (\preg_match($regexTag, $tag, $matches)) {
              $return = array(
                  'tagname' => $matches[1],
                  'attribs' => self::parseAttribString($matches[2]),
                  'innerhtml' => $matches[3],
              );
          } elseif (\preg_match($regexTag2, $tag, $matches)) {
              $return = array(
                  'tagname' => $matches[1],
                  'attribs' => self::parseAttribString($matches[2]),
                  'innerhtml' => null,
              );
          }
          return $return;
      }
docs: Parse HTML/XML tag
  
  returns array(
  'tagname' => string
  'attribs' => array
  'innerhtml' => string | null
  )
  
  @param string $tag html tag to parse
  
  @return array