extractarea.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package public
  2. import (
  3. "fmt"
  4. util "app.yhyue.com/moapp/jybase/common"
  5. )
  6. var CityConfig map[string]interface{}
  7. var AreaGet DFA //敏感词
  8. func init() {
  9. util.ReadConfig("./city.json", &CityConfig)
  10. city, _ := CityConfig["city"].([]interface{})
  11. citys := []string{}
  12. for _, v := range city {
  13. citys = append(citys, fmt.Sprint(v))
  14. }
  15. AreaGet = DFA{}
  16. AreaGet.AddWord(citys...)
  17. }
  18. type DFA struct {
  19. Link map[string]interface{}
  20. }
  21. func DealString(title string) bool {
  22. return AreaGet.CheckSensitiveWord(title)
  23. }
  24. func (d *DFA) AddWordAll(haskey bool, keys ...string) {
  25. if d.Link == nil {
  26. d.Link = make(map[string]interface{})
  27. }
  28. for _, key := range keys {
  29. nowMap := &d.Link
  30. for i := 0; i < len(key); i++ {
  31. kc := key[i : i+1]
  32. if v, ok := (*nowMap)[kc]; ok {
  33. nowMap, _ = v.(*map[string]interface{})
  34. } else {
  35. newMap := map[string]interface{}{}
  36. newMap["YN"] = "0"
  37. (*nowMap)[kc] = &newMap
  38. nowMap = &newMap
  39. }
  40. if i == len(key)-1 {
  41. (*nowMap)["YN"] = "1"
  42. }
  43. }
  44. }
  45. }
  46. func (d *DFA) AddWord(keys ...string) {
  47. d.AddWordAll(true, keys...)
  48. }
  49. //适合一次查找
  50. func (d *DFA) CheckSensitiveWord(src string) bool {
  51. pos := 0
  52. nowMap := &d.Link
  53. res := false
  54. for i := 0; i < len(src); i++ {
  55. word := src[i : i+1]
  56. nowMap, _ = (*nowMap)[word].(*map[string]interface{})
  57. if nowMap != nil { // 存在,则判断是否为最后一个
  58. if pos == 0 {
  59. pos = i
  60. }
  61. if "1" == util.ObjToString((*nowMap)["YN"]) { // 如果为最后一个匹配规则,结束循环,返回匹配标识数
  62. res = true
  63. pos = 0
  64. break
  65. }
  66. } else {
  67. nowMap = &d.Link
  68. if pos > 0 {
  69. i = pos
  70. pos = 0
  71. }
  72. }
  73. }
  74. return res
  75. }