• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > @功能是如何高效实现的

@功能是如何高效实现的

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了多功能高效防水剂,高效多功能防水背胶,高效过滤器功能,高效多功能压皮机,高效多功能厌氧反应器等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:@功能是如何高效实现的
描述:

现在很多网站都有@功能,weibo,qq等,对于一段文字中嵌入如@sharecqy这样的文本,如何高效的把它提取出来。

我的思路是,检测到@后,先在好友中查找,没找到,在到整个用户数据库中做最大匹配。

至于如何查询,听说有种叫字典树的结构,不知道是不是可以用来解决这个问题,了解的介绍下。


解决方案1:

用自动机解决:先用 strchr/memchr 找到 @,然后从下一个字符开始做最长匹配。自动机的功能比Trie树强,内存用量比Trie树小得多(小十几倍、甚至几十几百倍)

解决方案2:

OSCHINA @提到我 的处理代码 传送门

static Pattern referer_pattern = Pattern.compile("@([^@^\\s^:]{1,})([\\s\\:\\,\\;]{0,1})");//@.+?[\\s:]

/**
 * 处理提到某人 @xxxx
 * @param msg  传入的文本内容
 * @param referers 传出被引用到的会员名单
 * @return 返回带有链接的文本内容
 */
public static String _GenerateRefererLinks(String msg, List<Long> referers) {
    StringBuilder html = new StringBuilder();
    int lastIdx = 0;
    Matcher matchr = referer_pattern.matcher(msg);
    while (matchr.find()) {
        String origion_str = matchr.group();
        //System.out.println("-->"+origion_str);
        String str = origion_str.substring(1, origion_str.length()).trim();
        //char ch = str.charAt(str.length()-1);
        //if(ch == ':' || ch == ',' || ch == ';')
        //  str = str.substring(0, str.length()-1);
        //System.out.println(str);
        html.append(msg.substring(lastIdx, matchr.start()));

        User u = null;
        @SuppressWarnings("unchecked")
        List<User> users = User.INSTANCE.LoadList(User.CheckUsername(str)); 
        if(users != null && users.size()>0){
            u = users.get(0);
            for(User ref : users){
                if(ref.getThis_login_time()!=null && u.getThis_login_time()!=null && 
                        ref.getThis_login_time().after(u.getThis_login_time())){
                    u = ref;
                }
            }
        }
        if(u == null){
            u = User.GetByIdent(str);
        }

        if(u != null && !u.IsBlocked()){
            html.append("<a href='"+LinkTool.user(u)+"' target='_blank'>@");
            html.append(str.trim());
            html.append("</a> ");
            if(referers != null && !referers.contains(u.getId()))
                referers.add(u.getId());
        }
        else{
            html.append(origion_str);
        }
        lastIdx = matchr.end();
        //if(ch == ':' || ch == ',' || ch == ';')
        //  html.append(ch);
    }
    html.append(msg.substring(lastIdx));
    return html.toString();
}

还有一款jquery插件:jquery-mentionsinput Github 传送门(没用过,暂不评价)

解决方案3:

目前我提供本站的处理方法,在textarea中进行事件绑定@,使用正则的方式将@符号匹配出来。然后将数据进行查找。

$("textarea[name=message]").atWho("@",{
tpl: "<li data-value='${name}'>${name} <small>${spacenote}</small></li>",
'data':friend_list
});

数据,可以用sql将用户A的好友【关注】数量全部赛选出来,放入缓存,memcacedA。然后使用js json的方式去解析即可。memcacedA请注意时间。

最后数据提交,有正则去匹配出有 @xxxx 后的xxxx,进行sql查询,如果做了队列[缓存],用队列[缓存]是最优的方法。

PHP 的正则为:

$data = "@sharecqy @@@@@@@@@@@@@@ahc ";
preg_match_all("/@([^@]+?)([\s|:]|$)/is", $data, $matches);
print_r($matches);

以上是本站使用的@操作,我也在学习最高效的解决办法。

最后附上atme.js

http://ichord.github.io/At.js/


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • @功能是如何高效实现的

相关文章

  • 2017-06-07 Laravel42部署的问题
  • 2017-06-07 opencvpython怎么配置?请大神指点一下
  • 2017-06-07 C语言如何读取该文件内容
  • 2017-06-07 Flask怎么显示通过textarea输入换行的文本?
  • 2017-06-07 Windows下如何搭建flask开发环境?
  • 2017-06-07 laravelopenssl_random_pseudo_bytes这个函数是什么扩展的?谢谢
  • 2017-06-07 如何通过7牛700api上传图片,返回文件名和文件扩展名?
  • 2017-06-07 采用redis共享SESSION的时候,那么回话数据的key,是不是还是要基于COOKIE?
  • 2017-06-07 Maciterm2上传下载文件
  • 2017-06-07 redis两个程序之间的session数据会互串的情况

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • (python)Powershell里英文也乱码?
    • c语言统计数字、空白符、以及所有其他字符出现的次数
    • python计算48除以01有bug,求真理
    • 如何下载视频到mp4如何合并七牛的mp4静音视频和mp3音频
    • (flask)相同的程序在python273和272环境下执行的结果会不同吗?
    • php数组获取父节点
    • pojpoj一道基础广搜题,求解答
    • 七牛有没有直接与git仓库绑定的功能
    • Railsassets:precompilecss失效问题
    • python爬虫python中列表内能否套字典?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有