fswex.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package fsw
  2. //敏感词过滤,扩展,类似查字典
  3. type Fsw struct {
  4. IsStart bool
  5. IsEnd bool
  6. Char string //字符
  7. Link map[string]*Fsw //下级对象
  8. }
  9. //
  10. type FswScan struct {
  11. FswDictionary map[string]*Fsw //
  12. }
  13. //
  14. func NewFswScan() *FswScan {
  15. return &FswScan{
  16. FswDictionary: make(map[string]*Fsw),
  17. }
  18. }
  19. //追加
  20. func (fsw *FswScan) AddWord(word string) {
  21. var cfsw *Fsw
  22. rs := []rune(word)
  23. for i, wv := range rs {
  24. kc := string(wv)
  25. if i == 0 { //初始化
  26. if v, ok := fsw.FswDictionary[kc]; ok {
  27. cfsw = v
  28. } else {
  29. cfsw = &Fsw{
  30. Char: kc,
  31. IsStart: true,
  32. Link: make(map[string]*Fsw),
  33. }
  34. fsw.FswDictionary[kc] = cfsw
  35. }
  36. continue
  37. }
  38. //查询
  39. if v, ok := (*cfsw).Link[kc]; ok {
  40. cfsw = v
  41. } else {
  42. tmp := &Fsw{
  43. Char: kc,
  44. IsStart: true,
  45. Link: make(map[string]*Fsw),
  46. }
  47. (*cfsw).Link[kc] = tmp
  48. cfsw = tmp
  49. }
  50. //判断结束
  51. }
  52. (*cfsw).IsEnd = true
  53. }
  54. //
  55. func (fsw *FswScan) AddWords(words []string) {
  56. for _, v := range words {
  57. fsw.AddWord(v)
  58. }
  59. }
  60. /*按字典查找
  61. 匹配模式:最大匹配,最小匹配,
  62. 目前是最小匹配
  63. */
  64. func (fsw *FswScan) Filter(src string) (string, bool) {
  65. rs := []rune(src)
  66. for i := 0; i < len(rs); i++ {
  67. char := string(rs[i])
  68. if f, ok := fsw.FswDictionary[char]; ok { //某1个字匹配上了
  69. for j := i + 1; j < len(rs); j++ {
  70. char = string(rs[j])
  71. if v, ok := f.Link[char]; ok {
  72. f = v
  73. if v.IsEnd { //找到了
  74. return string(rs[i : j+1]), true
  75. }
  76. } else {
  77. break
  78. }
  79. }
  80. }
  81. }
  82. return "", false
  83. }