识别组标签

时间:2014-01-23 21:07:57

标签: php algorithm tags

我不知道如何处理这个问题 - 我有一个有玩家的清单,例如

  
      
  • 播放器
  •   
  • Coco [infi]
  •   
  • booo #team
  •   
  • 有人
  •   
  • Dabadee #team
  •   
  • goliat #team
  •   
  • stratder [infi]
  •   

显然,Cocostratder有一个团队标记[infi]booogoliatDabadee都有一个名为{{1的标记}}

我想列出不同的标签,但标签可以是#team <tag> #tag或任何人(游戏)家族标签(我正在提取播放数据)来自服务器)。

我不确定如何做到这一点,我能做的最好的事情是:

  • 爆炸[tag]
  • 将爆炸中的每个可能项目添加到数组
  • 使数组只显示唯一项目
  • 计算每个字符串在原始播放器列表中找到的次数

但是,如果我为空间爆炸,则会跳过" "

有更好的想法吗?

1 个答案:

答案 0 :(得分:2)

这看起来像正则表达式的工作。你可以有一定数量的regexp,并尝试一个接一个地匹配它们:

/**
 * function to return a tag given a playerName
 * @param  $playerName      string: player name, e.g. Coco [teamTag]
 * @return array            matching syntax (here 'brackets') and tag value (teamTag)
 */
function getTag($playerName) {

    // Allowed syntaxes

    $tagSyntaxes = array(
        'hash'    => '/#([\\w\\d]+)$/',
        'html'    => '/<tag>(.*?)<\/tag>/',
        'bracket' => '/[[](.*?)[]]/',
    );

    // One loop to rule them all
    foreach ($tagSyntaxes as $syntaxName => $regexp) {
        if (preg_match($regexp, $playerName, $gregs)) {
            // First syntax to match wins.
            return array(
                'syntax' => $syntaxName,
                'tag'    => $gregs[1])
            )
        }
    }
    // Loop exited with no match. Return a "dummy" tag
    return array('syntax' => 'none', 'tag' => null);
}