关灯
开启左侧

魔兽私服聊天(世界喊话等)文字过滤函数

  [复制链接]
admin实名认证 发表于 2016-4-27 23:00:55 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
魔兽私服中,你是否遇见很多玩家互相说脏话什么的,批评GM什么的。

当然,你也希望能过滤掉这些说话的内容。下面的这个函数就是过滤用的

std::string swearingReplacement(std::string str, std::string oldStr, const std::string newStr)
                                                   需要过滤的词语     过滤前的语句            过滤后的语句


这个就是诅咒,咒骂过滤系统

看看完整的函数。

    std::string swearingReplacement(std::string str, std::string oldStr, const std::string newStr)
    {
        typedef UNORDERED_MAP<char, size_t> FillerCharContainer;
        FillerCharContainer m_FillerCharContainer;


        size_t pos = 0;
        // This sting will keep original case (capitals etc..)
        std::string filteredString = str;
        // the str string will be lowercase. To make matching easier from database
        std::transform(str.begin(), str.end(), str.begin(), ::tolower);
        // Oldstr must search for lower case only, as that is what the string we are searching trough is.
        std::transform(oldStr.begin(), oldStr.end(), oldStr.begin(), ::tolower);

        for (std::string::iterator itr = str.begin(); itr != str.end(); ++itr)
        {
            if (ispunct(*itr) || isspace(*itr))
                m_FillerCharContainer.insert(std::make_pair<char, size_t>(*itr, pos));

            ++pos;
        }

        for (FillerCharContainer::const_iterator itr1 = m_FillerCharContainer.begin(); itr1 != m_FillerCharContainer.end(); ++itr1)
        {
            str.replace(itr1->second, 1, "");
            filteredString.replace(itr1->second, 1, "");
        }

        pos = 0;

        // We loop the lowercase string.
        while((pos = str.find(oldStr, pos)) != std::string::npos)
        {
            size_t oldPos = pos;
            // We replace equally in both strings, so they keep in sync on next iteration (if any next iteration).
            str.replace(pos, oldStr.length(), newStr);
            filteredString.replace(pos, oldStr.length(), newStr);
            pos += newStr.length();



            for (FillerCharContainer::iterator itr2 = m_FillerCharContainer.begin(); itr2 != m_FillerCharContainer.end();)
            {
                if (itr2->second >= oldPos + oldStr.length())
                    itr2->second += newStr.length() - oldStr.length();

                size_t punctPos = itr2->second;
                if (punctPos > oldPos && punctPos < oldPos + oldStr.length())
                    itr2 = m_FillerCharContainer.erase(itr2);
                else
                    ++itr2;
            }
        }

        for (FillerCharContainer::const_iterator itr3 = m_FillerCharContainer.begin(); itr3 != m_FillerCharContainer.end(); ++itr3)
            filteredString.insert(filteredString.begin() + itr3->second, itr1->first);

        return filteredString;
    }



这个就是一个独立的函数,你得需要基本的C++知识。然后把函数加到你的代码中,就可以使用了!!

具体怎么使用,自己就多考虑考虑了


下面是完整代码下载
游客,如果您要查看本帖隐藏内容请回复




标签:魔兽私服
 

精彩评论1

倒序浏览
我回来了 发表于 2016-11-8 04:22:03 | 显示全部楼层
 
楼主好棒,终于找到需要的了!有需求就来吾爱尚玩!
 
VIP介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 最佳新人

    注册账号后积极发帖的会员
  • 活跃会员

    经常参与各类话题的讨论,发帖内容较有主见
  • 热心会员

    经常帮助其他会员答疑
  • 推广达人

    积极宣传本站,为本站带来更多注册会员
  • 宣传达人

    积极宣传本站,为本站带来更多的用户访问量
  • 灌水之王

    经常在论坛发帖,且发帖量较大
  • 突出贡献

    长期对论坛的繁荣而不断努力,或多次提出建设性意见
  • 优秀版主

    活跃且尽责职守的版主
  • 荣誉管理

    曾经为论坛做出突出贡献目前已离职的版主
  • 论坛元老

    为论坛做出突出贡献的会员

0关注

5粉丝

3421帖子

排行榜
作者专栏

QQ交流群&&微信订阅号

QQ交流群

微信订阅号

吾爱尚玩资源基地永久域名:

Www.523Play.Com

在线管理员QQ:1589479632

邮箱:Email@523play.com

QQ交流群:558936238

Copyright   ©2015-2116  吾爱尚玩资源基地|523play.comPowered by©523Pplay.Com技术支持:吾爱尚玩资源基地