StringUtils.java 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. /**
  2. * Copyright &copy;1997-2017 <a href="http://www.hxiswater.com">huaxutech</a> All rights reserved.
  3. */
  4. package com.huaxu.common;
  5. import java.io.UnsupportedEncodingException;
  6. import java.util.List;
  7. import java.util.Locale;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;
  10. import javax.servlet.http.HttpServletRequest;
  11. import org.apache.commons.lang3.StringEscapeUtils;
  12. import org.springframework.web.context.request.RequestContextHolder;
  13. import org.springframework.web.context.request.ServletRequestAttributes;
  14. import org.springframework.web.servlet.LocaleResolver;
  15. import com.google.common.collect.Lists;
  16. /**
  17. * 字符串工具类, 继承org.apache.commons.lang3.StringUtils类
  18. * @author wyy
  19. * @version 2013-05-22
  20. */
  21. public class StringUtils extends org.apache.commons.lang3.StringUtils {
  22. private static final char SEPARATOR = '_';
  23. private static final String CHARSET_NAME = "UTF-8";
  24. /**
  25. * 转换为字节数组
  26. * @param str
  27. * @return
  28. */
  29. public static byte[] getBytes(String str){
  30. if (str != null){
  31. try {
  32. return str.getBytes(CHARSET_NAME);
  33. } catch (UnsupportedEncodingException e) {
  34. return null;
  35. }
  36. }else{
  37. return null;
  38. }
  39. }
  40. /**
  41. * 转换为字节数组
  42. * @param bytes
  43. * @return
  44. */
  45. public static String toString(byte[] bytes){
  46. try {
  47. return new String(bytes, CHARSET_NAME);
  48. } catch (UnsupportedEncodingException e) {
  49. return EMPTY;
  50. }
  51. }
  52. /**
  53. * 是否包含字符串
  54. * @param str 验证字符串
  55. * @param strs 字符串组
  56. * @return 包含返回true
  57. */
  58. public static boolean inString(String str, String... strs){
  59. if (str != null){
  60. for (String s : strs){
  61. if (str.equals(trim(s))){
  62. return true;
  63. }
  64. }
  65. }
  66. return false;
  67. }
  68. /**
  69. * 替换掉HTML标签方法
  70. */
  71. public static String replaceHtml(String html) {
  72. if (isBlank(html)){
  73. return "";
  74. }
  75. String regEx = "<.+?>";
  76. Pattern p = Pattern.compile(regEx);
  77. Matcher m = p.matcher(html);
  78. String s = m.replaceAll("");
  79. return s;
  80. }
  81. /**
  82. * 替换为手机识别的HTML,去掉样式及属性,保留回车。
  83. * @param html
  84. * @return
  85. */
  86. public static String replaceMobileHtml(String html){
  87. if (html == null){
  88. return "";
  89. }
  90. return html.replaceAll("<([a-z]+?)\\s+?.*?>", "<$1>");
  91. }
  92. /**
  93. * 缩略字符串(不区分中英文字符)
  94. * @param str 目标字符串
  95. * @param length 截取长度
  96. * @return
  97. */
  98. public static String abbr(String str, int length) {
  99. if (str == null) {
  100. return "";
  101. }
  102. try {
  103. StringBuilder sb = new StringBuilder();
  104. int currentLength = 0;
  105. for (char c : replaceHtml(StringEscapeUtils.unescapeHtml4(str)).toCharArray()) {
  106. currentLength += String.valueOf(c).getBytes("GBK").length;
  107. if (currentLength <= length - 3) {
  108. sb.append(c);
  109. } else {
  110. sb.append("...");
  111. break;
  112. }
  113. }
  114. return sb.toString();
  115. } catch (UnsupportedEncodingException e) {
  116. e.printStackTrace();
  117. }
  118. return "";
  119. }
  120. public static String abbr2(String param, int length) {
  121. if (param == null) {
  122. return "";
  123. }
  124. StringBuffer result = new StringBuffer();
  125. int n = 0;
  126. char temp;
  127. boolean isCode = false; // 是不是HTML代码
  128. boolean isHTML = false; // 是不是HTML特殊字符,如&nbsp;
  129. for (int i = 0; i < param.length(); i++) {
  130. temp = param.charAt(i);
  131. if (temp == '<') {
  132. isCode = true;
  133. } else if (temp == '&') {
  134. isHTML = true;
  135. } else if (temp == '>' && isCode) {
  136. n = n - 1;
  137. isCode = false;
  138. } else if (temp == ';' && isHTML) {
  139. isHTML = false;
  140. }
  141. try {
  142. if (!isCode && !isHTML) {
  143. n += String.valueOf(temp).getBytes("GBK").length;
  144. }
  145. } catch (UnsupportedEncodingException e) {
  146. e.printStackTrace();
  147. }
  148. if (n <= length - 3) {
  149. result.append(temp);
  150. } else {
  151. result.append("...");
  152. break;
  153. }
  154. }
  155. // 取出截取字符串中的HTML标记
  156. String temp_result = result.toString().replaceAll("(>)[^<>]*(<?)",
  157. "$1$2");
  158. // 去掉不需要结素标记的HTML标记
  159. temp_result = temp_result
  160. .replaceAll(
  161. "</?(AREA|BASE|BASEFONT|BODY|BR|COL|COLGROUP|DD|DT|FRAME|HEAD|HR|HTML|IMG|INPUT|ISINDEX|LI|LINK|META|OPTION|P|PARAM|TBODY|TD|TFOOT|TH|THEAD|TR|area|base|basefont|body|br|col|colgroup|dd|dt|frame|head|hr|html|img|input|isindex|li|link|meta|option|p|param|tbody|td|tfoot|th|thead|tr)[^<>]*/?>",
  162. "");
  163. // 去掉成对的HTML标记
  164. temp_result = temp_result.replaceAll("<([a-zA-Z]+)[^<>]*>(.*?)</\\1>",
  165. "$2");
  166. // 用正则表达式取出标记
  167. Pattern p = Pattern.compile("<([a-zA-Z]+)[^<>]*>");
  168. Matcher m = p.matcher(temp_result);
  169. List<String> endHTML = Lists.newArrayList();
  170. while (m.find()) {
  171. endHTML.add(m.group(1));
  172. }
  173. // 补全不成对的HTML标记
  174. for (int i = endHTML.size() - 1; i >= 0; i--) {
  175. result.append("</");
  176. result.append(endHTML.get(i));
  177. result.append(">");
  178. }
  179. return result.toString();
  180. }
  181. /**
  182. * 转换为Double类型
  183. */
  184. public static Double toDouble(Object val){
  185. if (val == null){
  186. return 0D;
  187. }
  188. try {
  189. return Double.valueOf(trim(val.toString()));
  190. } catch (Exception e) {
  191. return 0D;
  192. }
  193. }
  194. /**
  195. * 转换为Float类型
  196. */
  197. public static Float toFloat(Object val){
  198. return toDouble(val).floatValue();
  199. }
  200. /**
  201. * 转换为Long类型
  202. */
  203. public static Long toLong(Object val){
  204. return toDouble(val).longValue();
  205. }
  206. /**
  207. * 转换为Integer类型
  208. */
  209. public static Integer toInteger(Object val){
  210. return toLong(val).intValue();
  211. }
  212. /**
  213. * 获得用户远程地址
  214. */
  215. public static String getRemoteAddr(HttpServletRequest request){
  216. String remoteAddr = request.getHeader("X-Real-IP");
  217. if (isNotBlank(remoteAddr)) {
  218. remoteAddr = request.getHeader("X-Forwarded-For");
  219. }else if (isNotBlank(remoteAddr)) {
  220. remoteAddr = request.getHeader("Proxy-Client-IP");
  221. }else if (isNotBlank(remoteAddr)) {
  222. remoteAddr = request.getHeader("WL-Proxy-Client-IP");
  223. }
  224. return remoteAddr != null ? remoteAddr : request.getRemoteAddr();
  225. }
  226. /**
  227. * 驼峰命名法工具
  228. * @return
  229. * toCamelCase("hello_world") == "helloWorld"
  230. * toCapitalizeCamelCase("hello_world") == "HelloWorld"
  231. * toUnderScoreCase("helloWorld") = "hello_world"
  232. */
  233. public static String toCamelCase(String s) {
  234. if (s == null) {
  235. return null;
  236. }
  237. s = s.toLowerCase();
  238. StringBuilder sb = new StringBuilder(s.length());
  239. boolean upperCase = false;
  240. for (int i = 0; i < s.length(); i++) {
  241. char c = s.charAt(i);
  242. if (c == SEPARATOR) {
  243. upperCase = true;
  244. } else if (upperCase) {
  245. sb.append(Character.toUpperCase(c));
  246. upperCase = false;
  247. } else {
  248. sb.append(c);
  249. }
  250. }
  251. return sb.toString();
  252. }
  253. /**
  254. * 驼峰命名法工具
  255. * @return
  256. * toCamelCase("hello_world") == "helloWorld"
  257. * toCapitalizeCamelCase("hello_world") == "HelloWorld"
  258. * toUnderScoreCase("helloWorld") = "hello_world"
  259. */
  260. public static String toCapitalizeCamelCase(String s) {
  261. if (s == null) {
  262. return null;
  263. }
  264. s = toCamelCase(s);
  265. return s.substring(0, 1).toUpperCase() + s.substring(1);
  266. }
  267. /**
  268. * 驼峰命名法工具
  269. * @return
  270. * toCamelCase("hello_world") == "helloWorld"
  271. * toCapitalizeCamelCase("hello_world") == "HelloWorld"
  272. * toUnderScoreCase("helloWorld") = "hello_world"
  273. */
  274. public static String toUnderScoreCase(String s) {
  275. if (s == null) {
  276. return null;
  277. }
  278. StringBuilder sb = new StringBuilder();
  279. boolean upperCase = false;
  280. for (int i = 0; i < s.length(); i++) {
  281. char c = s.charAt(i);
  282. boolean nextUpperCase = true;
  283. if (i < (s.length() - 1)) {
  284. nextUpperCase = Character.isUpperCase(s.charAt(i + 1));
  285. }
  286. if ((i > 0) && Character.isUpperCase(c)) {
  287. if (!upperCase || !nextUpperCase) {
  288. sb.append(SEPARATOR);
  289. }
  290. upperCase = true;
  291. } else {
  292. upperCase = false;
  293. }
  294. sb.append(Character.toLowerCase(c));
  295. }
  296. return sb.toString();
  297. }
  298. /**
  299. * 转换为JS获取对象值,生成三目运算返回结果
  300. * @param objectString 对象串
  301. * 例如:row.user.id
  302. * 返回:!row?'':!row.user?'':!row.user.id?'':row.user.id
  303. */
  304. public static String jsGetVal(String objectString){
  305. StringBuilder result = new StringBuilder();
  306. StringBuilder val = new StringBuilder();
  307. String[] vals = split(objectString, ".");
  308. for (int i=0; i<vals.length; i++){
  309. val.append("." + vals[i]);
  310. result.append("!"+(val.substring(1))+"?'':");
  311. }
  312. result.append(val.substring(1));
  313. return result.toString();
  314. }
  315. }