Tools.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. using System;
  2. using System.Text;
  3. using System.Text.RegularExpressions;
  4. namespace Ant.Service.Utilities
  5. {
  6. /// <summary>
  7. /// 共用工具类
  8. /// </summary>
  9. public static class Tools
  10. {
  11. #region 获得用户IP
  12. /// <summary>
  13. /// 获得用户IP
  14. /// </summary>
  15. public static string GetUserIp()
  16. {
  17. string ip;
  18. string[] temp;
  19. bool isErr = false;
  20. if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_ForWARDED_For"] == null)
  21. ip = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
  22. else
  23. ip = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_ForWARDED_For"].ToString();
  24. if (ip.Length > 15)
  25. isErr = true;
  26. else
  27. {
  28. temp = ip.Split('.');
  29. if (temp.Length == 4)
  30. {
  31. for (int i = 0; i < temp.Length; i++)
  32. {
  33. if (temp[i].Length > 3) isErr = true;
  34. }
  35. }
  36. else
  37. isErr = true;
  38. }
  39. if (isErr)
  40. return "1.1.1.1";
  41. else
  42. return ip;
  43. }
  44. #endregion
  45. #region 根据配置对指定字符串进行 MD5 加密
  46. /// <summary>
  47. /// 根据配置对指定字符串进行 MD5 加密
  48. /// </summary>
  49. /// <param name="s"></param>
  50. /// <returns></returns>
  51. public static string GetMD5(string s)
  52. {
  53. //md5加密
  54. s = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s, "md5").ToString();
  55. return s.ToLower().Substring(8, 16);
  56. }
  57. #endregion
  58. #region 得到字符串长度,一个汉字长度为2
  59. /// <summary>
  60. /// 得到字符串长度,一个汉字长度为2
  61. /// </summary>
  62. /// <param name="inputString">参数字符串</param>
  63. /// <returns></returns>
  64. public static int StrLength(string inputString)
  65. {
  66. System.Text.ASCIIEncoding ascii = new System.Text.ASCIIEncoding();
  67. int tempLen = 0;
  68. byte[] s = ascii.GetBytes(inputString);
  69. for (int i = 0; i < s.Length; i++)
  70. {
  71. if ((int)s[i] == 63)
  72. tempLen += 2;
  73. else
  74. tempLen += 1;
  75. }
  76. return tempLen;
  77. }
  78. #endregion
  79. #region 截取指定长度字符串
  80. /// <summary>
  81. /// 截取指定长度字符串
  82. /// </summary>
  83. /// <param name="inputString">要处理的字符串</param>
  84. /// <param name="len">指定长度</param>
  85. /// <returns>返回处理后的字符串</returns>
  86. public static string ClipString(string inputString, int len)
  87. {
  88. bool isShowFix = false;
  89. if (len % 2 == 1)
  90. {
  91. isShowFix = true;
  92. len--;
  93. }
  94. System.Text.ASCIIEncoding ascii = new System.Text.ASCIIEncoding();
  95. int tempLen = 0;
  96. string tempString = "";
  97. byte[] s = ascii.GetBytes(inputString);
  98. for (int i = 0; i < s.Length; i++)
  99. {
  100. if ((int)s[i] == 63)
  101. tempLen += 2;
  102. else
  103. tempLen += 1;
  104. try
  105. {
  106. tempString += inputString.Substring(i, 1);
  107. }
  108. catch
  109. {
  110. break;
  111. }
  112. if (tempLen > len)
  113. break;
  114. }
  115. byte[] mybyte = System.Text.Encoding.Default.GetBytes(inputString);
  116. if (isShowFix && mybyte.Length > len)
  117. tempString += "…";
  118. return tempString;
  119. }
  120. #endregion
  121. #region 获得两个日期的间隔
  122. /// <summary>
  123. /// 获得两个日期的间隔
  124. /// </summary>
  125. /// <param name="DateTime1">日期一。</param>
  126. /// <param name="DateTime2">日期二。</param>
  127. /// <returns>日期间隔TimeSpan。</returns>
  128. public static TimeSpan DateDiff(DateTime DateTime1, DateTime DateTime2)
  129. {
  130. TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
  131. TimeSpan ts2 = new TimeSpan(DateTime2.Ticks);
  132. TimeSpan ts = ts1.Subtract(ts2).Duration();
  133. return ts;
  134. }
  135. #endregion
  136. #region 格式化日期时间
  137. /// <summary>
  138. /// 格式化日期时间
  139. /// </summary>
  140. /// <param name="dateTime1">日期时间</param>
  141. /// <param name="dateMode">显示模式</param>
  142. /// <returns>0-9种模式的日期</returns>
  143. public static string FormatDate(DateTime dateTime1, string dateMode)
  144. {
  145. switch (dateMode)
  146. {
  147. case "0":
  148. return dateTime1.ToString("yyyy-MM-dd");
  149. case "1":
  150. return dateTime1.ToString("yyyy-MM-dd HH:mm:ss");
  151. case "2":
  152. return dateTime1.ToString("yyyy/MM/dd");
  153. case "3":
  154. return dateTime1.ToString("yyyy年MM月dd日");
  155. case "4":
  156. return dateTime1.ToString("MM-dd");
  157. case "5":
  158. return dateTime1.ToString("MM/dd");
  159. case "6":
  160. return dateTime1.ToString("MM月dd日");
  161. case "7":
  162. return dateTime1.ToString("yyyy-MM");
  163. case "8":
  164. return dateTime1.ToString("yyyy/MM");
  165. case "9":
  166. return dateTime1.ToString("yyyy年MM月");
  167. default:
  168. return dateTime1.ToString();
  169. }
  170. }
  171. #endregion
  172. #region 得到随机日期
  173. /// <summary>
  174. /// 得到随机日期
  175. /// </summary>
  176. /// <param name="time1">起始日期</param>
  177. /// <param name="time2">结束日期</param>
  178. /// <returns>间隔日期之间的 随机日期</returns>
  179. public static DateTime GetRandomTime(DateTime time1, DateTime time2)
  180. {
  181. Random random = new Random();
  182. DateTime minTime = new DateTime();
  183. DateTime maxTime = new DateTime();
  184. System.TimeSpan ts = new System.TimeSpan(time1.Ticks - time2.Ticks);
  185. // 获取两个时间相隔的秒数
  186. double dTotalSecontds = ts.TotalSeconds;
  187. int iTotalSecontds = 0;
  188. if (dTotalSecontds > System.Int32.MaxValue)
  189. {
  190. iTotalSecontds = System.Int32.MaxValue;
  191. }
  192. else if (dTotalSecontds < System.Int32.MinValue)
  193. {
  194. iTotalSecontds = System.Int32.MinValue;
  195. }
  196. else
  197. {
  198. iTotalSecontds = (int)dTotalSecontds;
  199. }
  200. if (iTotalSecontds > 0)
  201. {
  202. minTime = time2;
  203. maxTime = time1;
  204. }
  205. else if (iTotalSecontds < 0)
  206. {
  207. minTime = time1;
  208. maxTime = time2;
  209. }
  210. else
  211. {
  212. return time1;
  213. }
  214. int maxValue = iTotalSecontds;
  215. if (iTotalSecontds <= System.Int32.MinValue)
  216. maxValue = System.Int32.MinValue + 1;
  217. int i = random.Next(System.Math.Abs(maxValue));
  218. return minTime.AddSeconds(i);
  219. }
  220. #endregion
  221. #region HTML转行成TEXT
  222. /// <summary>
  223. /// HTML转行成TEXT
  224. /// </summary>
  225. /// <param name="strHtml"></param>
  226. /// <returns></returns>
  227. public static string HtmlToTxt(string strHtml)
  228. {
  229. string[] aryReg ={
  230. @"<script[^>]*?>.*?</script>",
  231. @"<(\/\s*)?!?((\w+:)?\w+)(\w+(\s*=?\s*(([""'])(\\[""'tbnr]|[^\7])*?\7|\w+)|.{0})|\s)*?(\/\s*)?>",
  232. @"([\r\n])[\s]+",
  233. @"&(quot|#34);",
  234. @"&(amp|#38);",
  235. @"&(lt|#60);",
  236. @"&(gt|#62);",
  237. @"&(nbsp|#160);",
  238. @"&(iexcl|#161);",
  239. @"&(cent|#162);",
  240. @"&(pound|#163);",
  241. @"&(copy|#169);",
  242. @"&#(\d+);",
  243. @"-->",
  244. @"<!--.*\n"
  245. };
  246. string newReg = aryReg[0];
  247. string strOutput = strHtml;
  248. for (int i = 0; i < aryReg.Length; i++)
  249. {
  250. Regex regex = new Regex(aryReg[i], RegexOptions.IgnoreCase);
  251. strOutput = regex.Replace(strOutput, string.Empty);
  252. }
  253. strOutput.Replace("<", "");
  254. strOutput.Replace(">", "");
  255. strOutput.Replace("\r\n", "");
  256. return strOutput;
  257. }
  258. #endregion
  259. #region 判断对象是否为空
  260. /// <summary>
  261. /// 判断对象是否为空,为空返回true
  262. /// </summary>
  263. /// <typeparam name="T">要验证的对象的类型</typeparam>
  264. /// <param name="data">要验证的对象</param>
  265. public static bool IsNullOrEmpty<T>(T data)
  266. {
  267. //如果为null
  268. if (data == null)
  269. {
  270. return true;
  271. }
  272. //如果为""
  273. if (data.GetType() == typeof(String))
  274. {
  275. if (string.IsNullOrEmpty(data.ToString().Trim()))
  276. {
  277. return true;
  278. }
  279. }
  280. //如果为DBNull
  281. if (data.GetType() == typeof(DBNull))
  282. {
  283. return true;
  284. }
  285. //不为空
  286. return false;
  287. }
  288. /// <summary>
  289. /// 判断对象是否为空,为空返回true
  290. /// </summary>
  291. /// <param name="data">要验证的对象</param>
  292. public static bool IsNullOrEmpty(object data)
  293. {
  294. //如果为null
  295. if (data == null)
  296. {
  297. return true;
  298. }
  299. //如果为""
  300. if (data.GetType() == typeof(String))
  301. {
  302. if (string.IsNullOrEmpty(data.ToString().Trim()))
  303. {
  304. return true;
  305. }
  306. }
  307. //如果为DBNull
  308. if (data.GetType() == typeof(DBNull))
  309. {
  310. return true;
  311. }
  312. //不为空
  313. return false;
  314. }
  315. #endregion
  316. #region 验证IP地址是否合法
  317. /// <summary>
  318. /// 验证IP地址是否合法
  319. /// </summary>
  320. /// <param name="ip">要验证的IP地址</param>
  321. public static bool IsIP(string ip)
  322. {
  323. //如果为空,认为验证合格
  324. if (IsNullOrEmpty(ip))
  325. {
  326. return true;
  327. }
  328. //清除要验证字符串中的空格
  329. ip = ip.Trim();
  330. //模式字符串
  331. string pattern = @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$";
  332. //验证
  333. return RegexHelper.IsMatch(ip, pattern);
  334. }
  335. #endregion
  336. #region 验证EMail是否合法
  337. /// <summary>
  338. /// 验证EMail是否合法
  339. /// </summary>
  340. /// <param name="email">要验证的Email</param>
  341. public static bool IsEmail(string email)
  342. {
  343. //如果为空,认为验证不合格
  344. if (IsNullOrEmpty(email))
  345. {
  346. return false;
  347. }
  348. //清除要验证字符串中的空格
  349. email = email.Trim();
  350. //模式字符串
  351. string pattern = @"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$";
  352. //验证
  353. return RegexHelper.IsMatch(email, pattern);
  354. }
  355. #endregion
  356. #region 验证是否为整数
  357. /// <summary>
  358. /// 验证是否为整数 如果为空,认为验证不合格 返回false
  359. /// </summary>
  360. /// <param name="number">要验证的整数</param>
  361. public static bool IsInt(string number)
  362. {
  363. //如果为空,认为验证不合格
  364. if (IsNullOrEmpty(number))
  365. {
  366. return false;
  367. }
  368. //清除要验证字符串中的空格
  369. number = number.Trim();
  370. //模式字符串
  371. string pattern = @"^[0-9]+[0-9]*$";
  372. //验证
  373. return RegexHelper.IsMatch(number, pattern);
  374. }
  375. #endregion
  376. #region 验证是否为数字
  377. /// <summary>
  378. /// 验证是否为数字
  379. /// </summary>
  380. /// <param name="number">要验证的数字</param>
  381. public static bool IsNumber(string number)
  382. {
  383. //如果为空,认为验证不合格
  384. if (IsNullOrEmpty(number))
  385. {
  386. return false;
  387. }
  388. //清除要验证字符串中的空格
  389. number = number.Trim();
  390. //模式字符串
  391. string pattern = @"^[0-9]+[0-9]*[.]?[0-9]*$";
  392. //验证
  393. return RegexHelper.IsMatch(number, pattern);
  394. }
  395. #endregion
  396. #region 验证日期是否合法
  397. /// <summary>
  398. /// 验证日期是否合法,对不规则的作了简单处理
  399. /// </summary>
  400. /// <param name="date">日期</param>
  401. public static bool IsDate(ref string date)
  402. {
  403. //如果为空,认为验证合格
  404. if (IsNullOrEmpty(date))
  405. {
  406. return true;
  407. }
  408. //清除要验证字符串中的空格
  409. date = date.Trim();
  410. //替换\
  411. date = date.Replace(@"\", "-");
  412. //替换/
  413. date = date.Replace(@"/", "-");
  414. //如果查找到汉字"今",则认为是当前日期
  415. if (date.IndexOf("今") != -1)
  416. {
  417. date = DateTime.Now.ToString();
  418. }
  419. try
  420. {
  421. //用转换测试是否为规则的日期字符
  422. date = Convert.ToDateTime(date).ToString("d");
  423. return true;
  424. }
  425. catch
  426. {
  427. //如果日期字符串中存在非数字,则返回false
  428. if (!IsInt(date))
  429. {
  430. return false;
  431. }
  432. #region 对纯数字进行解析
  433. //对8位纯数字进行解析
  434. if (date.Length == 8)
  435. {
  436. //获取年月日
  437. string year = date.Substring(0, 4);
  438. string month = date.Substring(4, 2);
  439. string day = date.Substring(6, 2);
  440. //验证合法性
  441. if (Convert.ToInt32(year) < 1900 || Convert.ToInt32(year) > 2100)
  442. {
  443. return false;
  444. }
  445. if (Convert.ToInt32(month) > 12 || Convert.ToInt32(day) > 31)
  446. {
  447. return false;
  448. }
  449. //拼接日期
  450. date = Convert.ToDateTime(year + "-" + month + "-" + day).ToString("d");
  451. return true;
  452. }
  453. //对6位纯数字进行解析
  454. if (date.Length == 6)
  455. {
  456. //获取年月
  457. string year = date.Substring(0, 4);
  458. string month = date.Substring(4, 2);
  459. //验证合法性
  460. if (Convert.ToInt32(year) < 1900 || Convert.ToInt32(year) > 2100)
  461. {
  462. return false;
  463. }
  464. if (Convert.ToInt32(month) > 12)
  465. {
  466. return false;
  467. }
  468. //拼接日期
  469. date = Convert.ToDateTime(year + "-" + month).ToString("d");
  470. return true;
  471. }
  472. //对5位纯数字进行解析
  473. if (date.Length == 5)
  474. {
  475. //获取年月
  476. string year = date.Substring(0, 4);
  477. string month = date.Substring(4, 1);
  478. //验证合法性
  479. if (Convert.ToInt32(year) < 1900 || Convert.ToInt32(year) > 2100)
  480. {
  481. return false;
  482. }
  483. //拼接日期
  484. date = year + "-" + month;
  485. return true;
  486. }
  487. //对4位纯数字进行解析
  488. if (date.Length == 4)
  489. {
  490. //获取年
  491. string year = date.Substring(0, 4);
  492. //验证合法性
  493. if (Convert.ToInt32(year) < 1900 || Convert.ToInt32(year) > 2100)
  494. {
  495. return false;
  496. }
  497. //拼接日期
  498. date = Convert.ToDateTime(year).ToString("d");
  499. return true;
  500. }
  501. #endregion
  502. return false;
  503. }
  504. }
  505. #endregion
  506. #region 验证身份证是否合法
  507. /// <summary>
  508. /// 验证身份证是否合法
  509. /// </summary>
  510. /// <param name="idCard">要验证的身份证</param>
  511. public static bool IsIdCard(string idCard)
  512. {
  513. //如果为空,认为验证合格
  514. if (IsNullOrEmpty(idCard))
  515. {
  516. return true;
  517. }
  518. //清除要验证字符串中的空格
  519. idCard = idCard.Trim();
  520. //模式字符串
  521. StringBuilder pattern = new StringBuilder();
  522. pattern.Append(@"^(11|12|13|14|15|21|22|23|31|32|33|34|35|36|37|41|42|43|44|45|46|");
  523. pattern.Append(@"50|51|52|53|54|61|62|63|64|65|71|81|82|91)");
  524. pattern.Append(@"(\d{13}|\d{15}[\dx])$");
  525. //验证
  526. return RegexHelper.IsMatch(idCard, pattern.ToString());
  527. }
  528. #endregion
  529. #region 检测客户的输入中是否有危险字符串
  530. /// <summary>
  531. /// 检测客户输入的字符串是否有效,并将原始字符串修改为有效字符串或空字符串。
  532. /// 当检测到客户的输入中有攻击性危险字符串,则返回false,有效返回true。
  533. /// </summary>
  534. /// <param name="input">要检测的字符串</param>
  535. public static bool IsValidInput(ref string input)
  536. {
  537. try
  538. {
  539. if (IsNullOrEmpty(input))
  540. {
  541. //如果是空值,则跳出
  542. return true;
  543. }
  544. else
  545. {
  546. //替换单引号
  547. input = input.Replace("'", "''").Trim();
  548. //检测攻击性危险字符串
  549. string testString = "and |or |exec |insert |select |delete |update |count |chr |mid |master |truncate |char |declare ";
  550. string[] testArray = testString.Split('|');
  551. foreach (string testStr in testArray)
  552. {
  553. if (input.ToLower().IndexOf(testStr) != -1)
  554. {
  555. //检测到攻击字符串,清空传入的值
  556. input = "";
  557. return false;
  558. }
  559. }
  560. //未检测到攻击字符串
  561. return true;
  562. }
  563. }
  564. catch (Exception ex)
  565. {
  566. throw new Exception(ex.Message);
  567. }
  568. }
  569. #endregion
  570. }
  571. }