em{
font-style:normal;
color:crimson;
background:#DCDCDC;
}
=======================
String str1 = (String)pageContext.getAttribute("title");                 String keyword = (String)request.getAttribute("search");                 String[] temp = keyword.split("\\s+");                 String ns = null;                 int begin = str1.indexOf(temp[0]);                  if(begin > 15) ns = str1.substring(begin -15, str1.length());                 else ns = str1;                 if(ns.length() > 30) str1 = ns.substring(0, 30);                 else str1 = ns;                 for(String str : temp) str1 = str1.replaceAll(str, "<em>" + str + "</em>");                 pageContext.setAttribute("title", str1);这里对关键字着色就出了问题:
      如果一段文字是这样的:你是我心里的一首歌......
      输入的关键字是这样的:你 e那么就会出现这样的结果:<<em>e</em>m>你</<em>e</em>m>是我心里的一首歌......请问这样的问题该如何解决,帖子也不知道该放哪里  暂且放这里吧Best regards. 
  
      XiangFang

解决方案 »

  1.   

    自定义太麻烦了,直接用 Lucene 吧。高亮插件,好使
      

  2.   

    这是先替换“你”字,替换成了<em>你</em>,再替换“e”时,把em标签里的e也替换掉了,
    你在替换之前,可以先检查一下temp 数组中有没有e,m,em,有的话,先替换这些敏感字符,然后再替换别的
    想你给的代码里,你把关键字这样输入 “e 你”,就没有问题的
      

  3.   

    很明显是第二次替换时要替换的关键字与<em> </em>中间的某一个或是全部字符重合了,只是提个建议:
    替换时不要直接把<em> </em>加到关键字的两边,用另一种比较特殊的符号来代替,这种符号尽可能的即不是内容中可能会出现的,也不是关键字中会出现的,
    比如:用|代替<em>,用/|代替</em>,来替换,这样全部替换完后变成:
    |你/|是我心里的一首歌...... 这时即使e是关键字,同时也出现在内容中,也不会有问题:
    你是我心里的一首歌..e....就会变成:
    |你/|是我心里的一首歌..|e/|....
    等所有的关键字全部替换完后,再用<em>代替|,用</em>代替/|,最后一次成型肯定不会有问题。
    当然,这里只是打个比方,并不是说|与/|在内容中或是关键字中肯定不会出现,只是一个思路,具体用什么样的符号,即使内容中出现的要用的符号,用什么样的方法解决,那是另一回事,至少有个思路,解决的方法可以这样:如果内容中出现了|或/|,将代替的符号重复一次,即不再用|与/|,而改用||与/|/|,直到内容中不会出现为止。这种解决方法也只是个提议。转义呀等等,LZ都可以思考一下。