php聊天功能逻辑原理,"@xxx"提及用户,这种功能的实现原理是怎样的?

12

2014-12-13 22:05:54 +08:00   b7048e5c0150a989fed46971f5ac1886.png 1

在牛客网 http://www.nowcoder.com 用户在我们网站提交的评论,我们会进行敏感词过滤,其算法是基于有限状态机DFA过滤的。 我觉得可以用敏感词过滤的方法来查找@的用户ID。 (用户ID就是好多敏感词), 具体的代码如下:

/**

* 过滤敏感词

*

* @param text

* @return

*/

public String filter(String text) {

if (StringUtils.isBlank(text)) {

return text;

}

String replacement = DEFAULT_REPLACEMENT;

StringBuilder result = new StringBuilder();

DFATreeNode tempNode = rootNode;

int begin = 0; // 回滚数

int position = 0; // 当前比较的位置

while (position < text.length()) {

char c = text.charAt(position);

// 空格直接跳过

if (isSymbol(c)) {

++position;

continue;

}

tempNode = tempNode.getSubNode(c);

// 当前位置的匹配结束

if (tempNode == null) {

// 以begin开始的字符串不存在敏感词

result.append(text.charAt(begin));

// 跳到下一个字符开始测试

position = begin + 1;

begin = position;

// 回到树初始节点

tempNode = rootNode;

} else if (tempNode.isKeywordEnd()) {

// 发现敏感词, 从begin到position的位置用replacement替换掉

result.append(replacement);

position = position + 1;

begin = position;

tempNode = rootNode;

} else {

++position;

}

}

result.append(text.substring(begin));

return result.toString();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值