用的 Boyre-Moore 算法
现在遇到了一个问题
后台数据返回的文本字符串会包含高亮关键字,这个关键字是数据自带的,非搜索关键字
例如:
界面显示是这样的: "你好世界"
原数据是这样: "你好<em>世界</em>"
在搜索关键词为"好世界"时, 因为 em 标签(高亮)的缘故, 导致无法正确匹配
请问怎样修改算法, 能达到:
输入"好世界"
可以匹配到例如以下情况: 好<em>世界</em> 、好</em>世界 、 好世</em>界
     1 
                    
                    Kaakira   OP 求助... 
                 | 
            
     2 
                    
                    J0G57faC6uPo75W0      2020-02-18 00:22:39 +08:00 via Android 
                    
                    正则表达式啊。。 
                 | 
            
     3 
                    
                    AmosAlbert      2020-02-18 00:37:11 +08:00 
                    
                    正则表达式 
                 | 
            
     4 
                    
                    felix021      2020-02-18 00:45:30 +08:00 
                    
                    All problems in computer science can be solved by another level of indirection 
                比如:match(filter_tags(input_string), pattern)  | 
            
     6 
                    
                    Kaakira   OP 我想过把搜索关键词所有的可能性组合遍历 -> 算法搜索 -> 命中就结束。 
                搜索 好世界 未命中 ↓ 搜索 好<em>世界 未命中 ↓ 搜索 好<em 世</em>界 命中了 √ 不过还是挺笨的  | 
            
     7 
                    
                    gaobing      2020-02-18 01:04:18 +08:00 via Android 
                    
                    为文本生成去除标签的副本,对副本进行查找,就是比较浪费空间。 
                 | 
            
     8 
                    
                    enlight      2020-02-18 01:30:25 +08:00 
                    
                    
                 | 
            
     9 
                    
                    Kaakira   OP @enlight 哎挺麻烦的,我们已经是用 elasticsearch 从大量数据里筛选出来的, 然后高亮了,  我要对这些筛选出来的数据 在进行搜索,  算了, 返回上一个版本(正则表达式)... 
                 | 
            
     10 
                    
                    laminux29      2020-02-18 03:11:04 +08:00 
                    
                    ...... 
                上面都答错了。 你这哪里是什么搜索问题,而是一个简单的网页制作的问题(前端问题)。 1.<em>是 html 的标签,当它出现在网页源代码里,它的功能是强调标签内的文字。 2.你的搜索结果字符串里,包含了 html 标签,如果你把这个字符串,没做任何处理,直接放在前端网页里显示,搜索结果字符串里的<em>标签,就成了 html 网页源代码里的一部分,也就变成了强调功能,并且最终在显示出来的网页上面,也没有<em>这个子串。 2.你现在要做的是,把搜索结果,先进行 html 转义。转义后,再放在前端网页上显示,它就不会成为 html 功能的一部分,而会成为前端网页上的一个完整的字符串。  | 
            
     13 
                    
                    jmc891205      2020-02-18 13:02:16 +08:00 
                    
                    只需要考虑<em>标签吗?还是所有 html 标签甚至非 html 标签的其他字符串都需要考虑? 
                 | 
            
     15 
                    
                    jmc891205      2020-02-18 15:15:16 +08:00    @Kaakira 那我想你在实现 BM 算法比较 pattern 和当前 string window 发现 mismatch 的时候,看一下当前字符是不是'>',如果是的话再去检查前面是不是<em>或</em>,如果是这两个标签就跳过去检查这两个标签前面的字符是不是 mismatch。另外还要再额外维护一个跳转表,因为现在有忽略的字符,pattern 和 string 的 index 不是通过简单自增可以一一对应的了。 
                 | 
            
     16 
                    
                    coderEOS      2020-02-19 16:16:34 +08:00 
                    
                    1.去格式 2.正则 3.FlashText 
                 |