code: private static function parseTags($str)
      {
          $regexNotTag = '(?P<value>(?:(?!^@).)*)';
          $regexTags = '#^@(?P<tag>[\w-]+)[ \t]*'.$regexNotTag.'#sim';
          \preg_match_all($regexTags, $str, $matches, PREG_SET_ORDER);
          $singleTags = array('return');
          foreach ($matches as $match) {
              $value = $match['value'];
              $value = \preg_replace('/\n\s*\*\s*/', "\n", $value);
              $value = \trim($value);
              $value = self::parseTag($match['tag'], $value);
              if (\in_array($match['tag'], $singleTags)) {
                  $return[ $match['tag'] ] = $value;
              } else {
                  $return[ $match['tag'] ][] = $value;
              }
          }
          return $return;
      }
docs: Parse tags
  
  @param string $str portion of phpdoc content that contains tags
  
  @return array