package com.xnx3.template; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import com.xnx3.util.StringUtil; /** * 资源引用相关的处理,如,将资源引用的相对路径换为绝对路径 * @author 管雷鸣 */ public class ResourceQuote { private String baseUri = null; public ResourceQuote(String baseUri) { this.baseUri = baseUri; } public static void main(String[] args) { // Action.loadLocalTemplate(); Document doc = Global.templateMap.get("about1.html").getDoc(); ResourceQuote rq = new ResourceQuote("http://www.xnx3.com/res"); doc = rq.tagReplace(doc, "img", "src"); doc = rq.tagReplace(doc, "link", "href"); doc = rq.tagReplace(doc, "script", "src"); String html = rq.htmlFilter(doc.toString(), "src=\"(.*?)\""); System.out.println("之前:"+html); html = rq.htmlFilter(html, "background-image: *url\\('*(.*?)'*\\)"); System.out.println("之后:"+html); System.out.println(html); } /** * 替换 img 标签 * @param doc * @return */ public Document imgTag(Document doc){ Elements imgElements = doc.getElementsByTag("img"); for (int i = 0; i < imgElements.size(); i++) { Element e = imgElements.get(i); String url = e.attr("src"); String absUrl = hierarchyReplace(this.baseUri, url); if(!url.equals(absUrl)){ e.attr("src", absUrl); } } return doc; } /** * Tag标签的引用资源替换,替换为绝对路径 * @param doc Document,整个页面 * @param tagName tag的名字,如 img、 script * @param tagProperty 上面的tag中资源引用的标签,如 src * @return 替换好的Document */ public Document tagReplace(Document doc, String tagName, String tagProperty){ Elements imgElements = doc.getElementsByTag(tagName); for (int i = 0; i < imgElements.size(); i++) { Element e = imgElements.get(i); String url = e.attr(tagProperty); if(url.length() > 3 && url.indexOf(baseUri) == -1){ String absUrl = hierarchyReplace(this.baseUri, url); if((!url.equals(absUrl)) && url.indexOf("://") == -1){ //如果url未替换过,且不是绝对路径,那么进行替换操作 e.attr(tagProperty, absUrl); } } } return doc; } /** * 替换 src="" 中间的网址 * @param html html页面源代码 * @param regex 如 src=\"(.*?)\" * @return */ public String htmlFilter(String html, String regex){ //将找到的要替换的网址存入map。起排重的作用。可能一个网页中会有多个。此会在 htmlFilter 中进行提取。多个提取完毕后,才会统一进行替换 Map<String, String> map = new HashMap<String, String>(); Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(html); while (matcher.find()) { String src = matcher.group(1); //src的地址 if(!isAbsoluteUrl(src) && src.length() > 3 && map.get(src) == null && src.indexOf(baseUri) == -1){ //只要不是绝对路径的,都要替换为绝对路径 map.put(src, "1"); } } //将上面正则找到的网址,进行替换 for (Map.Entry<String, String> entry : map.entrySet()) { String src = entry.getKey(); //replace 加上前后标示,防止同一个图片出现多次,会多次匹配赋值 的情况 html = StringUtil.replaceAll(html, regex.replace("(.*?)", src), hierarchyReplace(this.baseUri, src)); } return html; } /** * 判断url是否是绝对路径网址 * @param url 要判断的url * @return true:是绝对路径的 */ public static boolean isAbsoluteUrl(String url){ if(url.indexOf("http://") > -1 || url.indexOf("https://") > -1 || url.indexOf("//") > -1){ return true; } return false; } /** * 替换掉路径的层级,即替换掉前缀的../ 、 ./ 、 / * @param prefixUrl 绝对路径前缀,如 http://www.wang.market/a/ */ public static String hierarchyReplace(String prefixUrl, String originalUrl){ if(isAbsoluteUrl(originalUrl)){ return originalUrl; } //判断前缀路径末尾是否有/,如没有,补上 if(prefixUrl.lastIndexOf("/") != prefixUrl.length()){ prefixUrl = prefixUrl + "/"; } //如果是跟路径引用,暂时直接返回组合网址 if(originalUrl.indexOf("/") == 0){ System.out.println("如果是跟路径引用,暂时直接返回组合网址--"+originalUrl); return prefixUrl+originalUrl.substring(1, originalUrl.length()); } while(originalUrl.indexOf("./") == 0 || originalUrl.indexOf("../") == 0){ if(originalUrl.indexOf("./") == 0){ //过滤前面的./ originalUrl = originalUrl.substring(2, originalUrl.length()); }else if (originalUrl.indexOf("../") == 0) { //过滤前面的./ originalUrl = originalUrl.substring(3, originalUrl.length()); //prefixUrl要向上一级 prefixUrl = prefixUrl.substring(0, prefixUrl.substring(0, prefixUrl.length()-1).lastIndexOf("/")+1); } } return prefixUrl+originalUrl; } }