来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
import java.util.regex.Matcher; import java.util.regex.Pattern; import com.eva.epc.common.file.FileHelper; public class Launch { public final static String WEBSITE_NAME = "即时通讯网(52im.net)"; public final static String BOOK_NAME = "TCP/IP详解卷1 协议"; public final static String CHAPTER_NAME = "缩略语"; public final static String BOOK_NAME_FOR_PAGNUM = "TCP/IP详解,卷1:协议"; public final static String CHAPTER_NAME_FOR_PAGNUM = "缩略语"; public static void main(String[] args) throws Exception { // String originalPath = "C:\\Documents and Settings\\Administrator\\桌面\\acrobat-8\\去掉回车换行+格式化后001.htm"; String originalPath = "C:\\xampp\\htdocs\\extend\\docs\\book\\tcpip\\vol1\\h\\index.html"; String originalText = FileHelper.readStringFromFile2(originalPath); String resultText = FileHelper.readStringFromFile2(originalPath); // System.out.println("内容是:"+originalText); originalText= resultText = truncateAndReplaceWithElementContent_P(originalText, resultText); // originalText= resultText = truncateAndReplaceWithElementContent(originalText, resultText // , "<SPAN style=(.*?)>(.*?)</SPAN>", null, null); originalText= resultText = truncateAndReplaceWithElementContent_SPAN(originalText, resultText); originalText= resultText = truncateAndReplaceWithElementContent(originalText, resultText , "<H4(.*?)>(.*?)</H4>", "<h4 id=\"hh_?\" class=\"net52im_h4_sectitle\">", "</h4>"); // originalText= resultText = truncateAndReplaceWithElementContent(originalText, resultText // , "<P style=(.*?)>(.*?)</P>","<P>","</P>"); originalText= resultText = truncateAndReplaceWithElementContent(originalText, resultText , "<ol style=(.*?)>(.*?)</ol>","<ol class=\"net52im_ol\">","</ol>"); originalText= resultText = truncateAndReplaceWithElementContent(originalText, resultText , "<LI style=(.*?)>(.*?)</LI>","<li><span>","</span></li>"); originalText= resultText = truncateAndReplaceWithElementContent(originalText, resultText , "<TD(.*?)>(.*?)</TD>","<td>","</td>"); // resultText = truncateAndReplaceWithElementContent(originalText, resultText // , "<TD(.*?)/>"); originalText= resultText = truncateAndReplaceWithElementContent_IMG(originalText, resultText); FileHelper.writeStringToFile(resultText , "C:\\Documents and Settings\\Administrator\\桌面\\"+System.currentTimeMillis()+".html"); } // 处理SPAN元素的方法(有额外条件和特殊处理) private static String truncateAndReplaceWithElementContent_SPAN(String originalText , String resultText) { String pattern1 = "<SPAN style=(.*?)>(.*?)</SPAN>"; // "<SPAN(.*?)>(.*?)</SPAN>"; // 创建 Pattern 对象 Pattern r = Pattern.compile(pattern1); // 现在创建 matcher 对象 Matcher m = r.matcher(originalText); while (m.find()) { String line = m.group(); String linePurText = getElementContent(line); // 代码或命令 if(line.contains("monospace") && line.contains("Courier")) { resultText = resultText.replace(line // 还要把中间每个字符间夹杂的一个空格给去掉 , "<span class=\"net52im_span_code\">"+(linePurText.replace(" ", "").trim())+"</span>"); } // 其它情况下的SPAN只取内容 else { resultText = resultText.replace(line // , linePurText.trim() // 将T C P / I P 这样的内容里的空格全去掉 , processSpaceForSPAN(linePurText.trim()) ); } } return resultText; } // 【本方法一定要放到各种元素处理前调用(不然会打乱特殊元素的附加处理)!!】处理P无法元素的方法(有额外条件和特殊处理) private static String truncateAndReplaceWithElementContent_P(String originalText , String resultText) { String pattern1 = "<P style=(.*?)>(.*?)</P>"; // 创建 Pattern 对象 Pattern r = Pattern.compile(pattern1); // 现在创建 matcher 对象 Matcher m = r.matcher(originalText); while (m.find()) { String line = m.group(); String linePurText = getElementContent(line); // 文内配图的说明文字(pdf转成的html里可能会错误地存在正常P变成配图文字的P,到时校订时手动改吧,没其它办法) if(line.contains("text-align:center;") && line.contains("text-indent:0px")) { resultText = resultText.replace(line , "<p class=\"net52im_p_imgdesc\">"+linePurText.trim()+"</p>"); } else if(line.contains("text-indent:26px")) { resultText = resultText.replace(line , "<p class=\"net52im_p_quote\">"+linePurText.trim()+"</p>"); } // 其它情况下的P清空各种属性 else { resultText = resultText.replace(line , "<p>"+linePurText.trim()+"</p>"); } } return resultText; } // 处理IMG无法元素的方法(有额外条件和特殊处理) private static String truncateAndReplaceWithElementContent_IMG(String originalText , String resultText) { String pattern1 = "<IMG (.*?)>"; // 创建 Pattern 对象 Pattern r = Pattern.compile(pattern1); // 现在创建 matcher 对象 Matcher m = r.matcher(originalText); while (m.find()) { String line = m.group(); // 奇数页的页码显示 if(line.contains("width=560") && line.contains("height=63")) // // { resultText = resultText.replace(line , "<div id=\"p\" class=\"net52im_p_pageji\">" + "<p>"+Launch.CHAPTER_NAME_FOR_PAGNUM+"<span>-1</span>" + "<a title=\"即时通讯网 - 即时通讯开发者社区!\" target=\"_blank\" " + "onmouseover=\"this.className='no_opacity'\" onmouseout=\"this.className=''\" " + "href=\"http://www.52im.net\"></a><img alt=\"____delete_this_img____\""+Launch.getImgSrc(line)+"></p></div>" ); } // 偶数页的页码显示 else if(line.contains("width=563") && line.contains("height=63")) { resultText = resultText.replace(line , "<div id=\"p\" class=\"net52im_p_pageou\">" + "<p><span>-2</span>"+Launch.BOOK_NAME_FOR_PAGNUM+ "<a title=\"即时通讯网 - 即时通讯开发者社区!\" target=\"_blank\" " + "onmouseover=\"this.className='no_opacity'\" onmouseout=\"this.className=''\" " + "href=\"http://www.52im.net\"></a><img alt=\"____delete_this_img____\""+Launch.getImgSrc(line)+"></p></div>" ); } // 文内配图 else { resultText = resultText.replace(line , "<p class=\"net52im_p_img\"><a href=\"http://www.52im.net\" title=\"即时通讯网 - 即时通讯开发者社区!\" target=\"_blank\"><img alt=\""+Launch.CHAPTER_NAME+"_"+Launch.BOOK_NAME+"_"+Launch.WEBSITE_NAME +"\" "+Launch.getImgSrc(line)+"></a></p>"); } } return resultText; } // 通用去掉元素首尾的方法 private static String truncateAndReplaceWithElementContent(String originalText , String resultText, String pattern1 , String newElementStart, String newElementEnd) { // 创建 Pattern 对象 Pattern r = Pattern.compile(pattern1); // 现在创建 matcher 对象 Matcher m = r.matcher(originalText); while (m.find()) { String line = m.group(); String linePurText = getElementContent(line); resultText = resultText.replace(line , (newElementStart==null?"":newElementStart) +linePurText.trim() +(newElementEnd==null?"":newElementEnd)); } return resultText; } // 返回一个文本元素的内容部分 private static String getElementContent(String htmlElement) { String ret = ""; if(htmlElement != null && !htmlElement.equals("")) { int s = htmlElement.indexOf(">"); int e = htmlElement.lastIndexOf("<"); // System.out.println(htmlElement.substring(s+1, e)); ret = htmlElement.substring(s+1, e); } return ret; } private static String getImgSrc(String htmlElement) { String ret = ""; if(htmlElement != null && !htmlElement.equals("")) { int s = htmlElement.indexOf("src"); int e = htmlElement.lastIndexOf(">"); // System.out.println(str.substring(s, e)); ret = htmlElement.substring(s, e); } return ret; } // 处理SPAN内文本的多余空格:将诸如“机需求R F C拷贝[Braden 1989a],阅读有关应用于T C P / I P” // 处理成“机需求RFC拷贝[Braden 1989a],阅读有关应用于TCP/IP”,注意两个英文单词间的空格要保留 public static String processSpaceForSPAN(String originalStr) { // 创建 Pattern 对象 Pattern r = Pattern.compile("\\w{2} \\b");// 先找到2个字母+一个空格结尾的字符串 // 现在创建 matcher 对象 Matcher m = r.matcher(originalStr); int i = 0; while (m.find()) { i++; String line = m.group(); System.out.println("原行:"+line);//+","+(line.replaceAll(" ", "@"))); // 【1】先保留两个单词间的穿格:将两个字母+一个空格的字符中的空 // 格替换成特殊占位字符(确保不与原文本内的正常字符碰装即可) originalStr = originalStr.replaceAll(line, line.replaceAll(" ", "々ぁゅヅ")); System.out.println("1次replace:"+originalStr); } System.out.println(i); // 完全没有匹配到两个单词的情况,简单处理即可 if(i == 0) { originalStr=originalStr.replaceAll(" ", ""); System.out.println("简单replace:"+originalStr); } else // 此步是接上面的循环,放在外面的原因是防止多于两个单词连着 // 时:如“Internet Protocol Suite”,会被错误地处理为“InternetProtocolSuite” // ,因为循环应该作为了才进行空格的replace! { // 【2】将第【1】步处理完的原字符串中,一个空格全部去掉 originalStr=originalStr.replaceAll(" ", ""); System.out.println("2次replace:"+originalStr); // 【3】将之前单词间的空格恢复出来 originalStr=originalStr.replaceAll("々ぁゅヅ", " "); System.out.println("3次replace:"+originalStr); } return originalStr; } }
引用:vimerbf 发表于 2019-04-27 09:36 谢谢大佬的无私指点! 第一步实在想不到,2、3步技术难度不小。 关键站长的前端能力也非常高。
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.140625 second(s), 43 queries , Gzip On.