问题描述
文章中对某些词加链接,例如对“百度”关键词:<p align="center"><img border="0" src="/UserFiles/Image/20120419082538_802.jpg" alt="">你好,欢迎加入百度!</p>我在jsp后台对该内容字段直接replace替换:<p align="center"><img border="0" src="/UserFiles/Image/20120419082538_802.jpg" alt="">你好,欢迎加入<a href="http://www.baidu.com">百度</a>!</p>但是,现在遇到一个问题,如果出现如下情况:<p align="center"><img border="0" src="/UserFiles/Image/20120419082538_802.jpg" alt="你好,欢迎加入百度">你好,欢迎加入百度!</p>就连img中alt内容都替换掉了:<p align="center"><img border="0" src="/UserFiles/Image/20120419082538_802.jpg" alt="你好,欢迎加入<a href="http://www.baidu.com">百度</a>">你好,欢迎加入<a href="http://www.baidu.com">百度</a>!</p>这样前台页面就出错了,该如何实现只替换普通内容的,alt中的内容不替换,求教高手们,谢谢! 问题补充:我的解决方法及思路:将图片img(或者直接alt标签)用某个不常出现的字符串替换掉,完成关键字替换后,再替换回来代码:ArrayList<String> keywordArrStrings = new ArrayList<String>();String content = "<p align="center"><img border="0" src="/UserFiles/Image/20120419082538_802.jpg" alt="你好,欢迎加入百度">你好,欢迎加入百度!</p> ";String regex = "<img[\s\S]+?>";Pattern p = Pattern.compile(regex);Matcher m = p.matcher(content);String val = null; while(m.find()){val = m.group();keywordArrStrings.add(val);}content = content.replaceAll(regex, "---------");/******************原程序加关键字部分代码**************************/for (int j = 0; j < keywordArrStrings.size(); j++) {content = content.replaceFirst("---------", keywordArrStrings.get(j));}
解决方案
String text = "<p align='center'><img border='0' src='/UserFiles/Image/20120419082538_802.jpg' alt='你好,欢迎加入百度'>你好,欢迎加入百度!</p>";String demo = "百度";String outText = "";String replaceText = "<a href='http://baidu.com'>百度</a>";if(!text.contains(demo)){outText = text;}else{do{int demoIndex = text.indexOf(demo);String leftText = text.substring(0, demoIndex);String rightText = text.substring(demoIndex+demo.length());int ltIndex = rightText.indexOf("<");int gtIndex = rightText.indexOf(">");if(ltIndex <= gtIndex){outText += (leftText+replaceText);}else{outText += (leftText+demo);}if(!rightText.contains(demo)){outText += rightText;break;}text = rightText;}while(text.contains(demo));}输出的outText就是你想要的结果,我这段代码主要是处理需要替换的字符串不应出现在尖括号对里,有一点需要注意的就是非html标签含义的‘<’‘>’可能会对程序输出产生影响。
解决方案二:
替换“百度!”为“<a>百度</a>!”