package com.xnx3.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.nodes.Element;

public class StringUtil {
	public static int count = 0;	//对比次数

	/**
	 * 文章相似度对比。越相似,越接近1
	 * @param str1
	 * @param str2
	 * @return 0~1
	 */
	public static double similarity(Element ele1, Element ele2){
		//首先进行tag的对比。当前标签tag一致,才有可能整个代码块相同
		String tag1 = ele1.tagName();
		String tag2 = ele2.tagName();
		if(tag1 != null && tag2 != null && tag1.equals(tag2)){
			//tag相同,进而对比其class、id
			
			//对比id
			if(ele1.attr("id").equals(ele2.attr("id"))){
				
				//对比class
				if(ele1.attr("class").equals(ele2.attr("class"))){
					return similarity_(ele1.toString(), ele2.toString());
				}
			}
		}
		return 0.1;
		
//		return similarity_(ele1.toString(), ele2.toString());
	}
	
	/**
	 * 文章相似度对比。越相似,越接近1
	 * @param str1
	 * @param str2
	 * @return 0~1
	 */
	public static double similarity_(String str1, String str2){
		str1 = purification(str1);
		str2 = purification(str2);
		if(str1.equals(str2)){
			return 1;
		}
		
		//进行长度比对,避免很长的字符串占用cpu
		int i1 = str1.length();
		int i2 = str2.length();
		double d = 0;	//结果在0~1,越接近1,则长度越相等
		if(i1 > i2){
			d = i2 / i1;
		}else{
			d = i1 / i2;
		}
		if(i1 < 200 && d > 0.85){
			//有希望相等
		}else if(i1 < 1000 && d > 0.92){
			//有那么点希望相等
		}else if(i1 < 3000 && d > 0.94){
			//有一丁点可能相等
		}else if(i1 < 10000 && d > 0.95){
			//相等很小,但有可能
		}else{
			//这里了直接判定就是不相等了,别浪费时间了,直接给0.2打发掉
			return 0.2;
		}
		
		count++;
		
//		if(Math.abs( / ) ){
//			
//		}
		try {
			return Computeclass.SimilarDegree(str1, str2);  
		} catch (Exception e) {
			return Computeclass.SimilarDegree(str2, str1);  
		}
	}
	
	/**
	 * 精华,将空格等字符去除,用于字符比对
	 * @param text
	 * @return
	 */
	public static String purification(String text){
		return text.replaceAll("\\s*", "");
	}
	
	/**
	 * 判断传入的字符串是否全部都是汉字、英文、数字。如果有某个字符不是,那么都会返回false
	 * @param str 要判断的字符串
	 * @return true:字符串的字符全部都在汉字、英文、数字中
	 */
	public static boolean isChinese(String str){
		return str.matches("[\\u4e00-\\u9fa5A-Za-z0-9]+");
	}
	
	public static void main(String[] args) {
		String a = "url(/image/default/1.png?v=201711250607";
		System.out.println(getFileNameByUrl(a));
	}
	

	/**
	 * 正则替换
	 * @param text 操作的内容源,主体
	 * @param regex 替换掉的
	 * @param replacement 替换成新的,取而代之的
	 * @return 提花好的内容
	 */
	public static String replaceAll(String text, String regex, String replacement){
		String s[] = {"?","(",")"}; 
		for (int i = 0; i < s.length; i++) {
			regex = regex.replaceAll("\\"+s[i], "\\\\"+s[i]);
		}
		text = text.replaceAll(regex, replacement);
		
		return text;
	}
	
	
	/**
	 * 替换掉路径的层级,即替换掉前缀的../  、  ./  、 /
	 * @param path 绝对路径前缀,如 http://www.wang.market/a/
	 * @param originalUrl 具体文件,如 ../js/func.js
	 */
	public static String hierarchyReplace(String path, String originalUrl){
		if(isAbsoluteUrl(originalUrl)){
			return originalUrl;
		}
		
		//提取出path中的域名
		String domain = "";		//如  http://wang.market   
		String s = path.substring(9, path.length());
		int domianInt = s.indexOf("/");
		if(domianInt > 0){
			domain = path.substring(0, domianInt+9);
		}
		
		//判断前缀路径末尾是否有/,如没有,补上
		if(path.lastIndexOf("/") != path.length()-1){
			path = path + "/";
		}
		
		//如果是跟路径引用,直接返回组合网址
		if(originalUrl.indexOf("/") == 0){
			return domain+originalUrl;
		}
		
		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要向上一级  
				//去掉最后的/
				String p = path.substring(0, path.length()-1);
				path = path.substring(0, p.lastIndexOf("/")+1);
			}
		}
		
		return path+originalUrl;
	}
	
	/**
	 * 判断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;
	}
	
	/**
	 * 获取当前url地址所在的远程文件路径
	 * @param url 目标url地址,绝对路径,如 http://www.wscso.com/test/a.jsp
	 * @return url所在地址的路径,返回如 http://www.wscso.com/test/
	 */
	public static String getPathByUrl(String url){
		int last = url.lastIndexOf("/");
		if(last > 8){
			url = url.substring(0, last+1);
		}
		
		return url;
	}
	
	/**
	 * 根据url地址,获取其访问的文件名字
	 * @param url 目标url,如 http://wang.market/images/a.jpg?a=123
	 * @return 返回访问的文件名,如以上url返回: a.jpg
	 */
	public static String getFileNameByUrl(String url){
		int last = url.lastIndexOf("/");
		if(last > 8){
			url = url.substring(last+1, url.length());
			if(url.indexOf("?") > 0){
				url = url.substring(0, url.indexOf("?"));
			}
			if(url.indexOf("#") > 0){
				url = url.substring(0, url.indexOf("#"));
			}
			return url;
		}else{
			//不是正常的url地址
			return "";
		}
		
	}
	
	

	/**
	 * 根据url地址,获取其访问的域名。若么有发现,返回空字符
	 * @param url 目标url,如 http://wang.market/images/a.jpg
	 * @return 返回wang.market
	 */
	public static String getDomainByUrl(String url){
		int start = url.indexOf("//");
		if(start > 0){
			url = url.substring(start+2, url.length());
			
			int end = url.indexOf("/");
			if(end > 0){
				url = url.substring(0, end);
			}
			return url;
		}
		
		return "";
	}
	
	/**
	 * 从指定字符串中提取字母跟数字,将其组合成一个新字符串返回
	 * @param text 要提取的目的字符串
	 * @return 若没有,返回空字符串""
	 */
	public static String extractAlphabetAndNumber(String text){
		StringBuffer sb = new StringBuffer();
        String s = "\\d+.\\d+|\\w+";
        Pattern pattern=Pattern.compile(s);  
        Matcher ma=pattern.matcher(text);  
        while(ma.find()){  
        	sb.append(ma.group());
        }
		return sb.toString();
	}
}