1 using System; 2 using System.Collections; 3 using System.Text; 4 using System.Text.RegularExpressions; 5 6 namespace Commons.Helpers 7 { 8 /// <summary> 9 /// 字符串操作助手类 10 /// </summary> 11 public class StringHelper 12 { 13 #region 获取处理好的行数据 14 public static SortedList GetSortedList(string line) 15 { 16 string src = line.Replace("\"\"", "'"); 17 18 MatchCollection col = Regex.Matches(src, ",\"([^\"]+)\",", RegexOptions.ExplicitCapture); 19 20 SortedList sl = new SortedList(); 21 IEnumerator ie = col.GetEnumerator(); 22 while (ie.MoveNext()) 23 { 24 string patn = ie.Current.ToString(); 25 int key = src.Substring(0, src.IndexOf(patn)).Split(',').Length; 26 if (!sl.ContainsKey(key)) 27 { 28 sl.Add(key, patn.Trim(new[] { ',', '"' }).Replace("'", "\"")); 29 src = src.Replace(patn, ",,"); 30 } 31 } 32 33 string[] arr = src.Split(','); 34 for (int i = 0; i < arr.Length; i++) 35 { 36 if (!sl.ContainsKey(i)) 37 { 38 sl.Add(i, arr[i]); 39 } 40 } 41 42 return sl; 43 } 44 #endregion 45 46 #region 字符串左补零 47 /// <summary> 48 /// 字符串左补零 49 /// </summary> 50 /// <param name="inStr">原字符串</param> 51 /// <param name="len">补零后字符串的总长</param> 52 /// <returns></returns> 53 public static string StringPadLeftZero(string inStr, int len) 54 { 55 string outStr = inStr; 56 57 if (inStr.Length < len) 58 { 59 outStr = inStr.PadLeft(len, '0'); 60 } 61 62 return outStr; 63 } 64 #endregion 65 66 #region 转换中文的逗号并去掉最后的逗号 67 /// <summary> 68 /// 转换中文的逗号并去掉最后的逗号 69 /// </summary> 70 /// <param name="strList">逗号串起来的字符串</param> 71 /// <returns>最后没用逗号的字符串</returns> 72 public static string DeleteLastComma(string strList) 73 { 74 //判断是否为空 75 if (!String.IsNullOrEmpty(strList)) 76 { 77 //转换中文的逗号 78 strList = Regex.Replace(strList, ",", ","); 79 //判断最后一位是否逗号 80 while (strList.IndexOf(',') == 0 || strList.LastIndexOf(',') == strList.Length - 1) 81 { 82 strList = strList.IndexOf(',') == 0 ? strList.Substring(1) : strList; 83 strList = strList.LastIndexOf(',') == strList.Length - 1 ? strList.Substring(0, strList.Length - 1) : strList; 84 } 85 } 86 return strList; 87 } 88 #endregion 89 90 #region 过滤特殊符号 91 /// <summary> 92 /// 过滤特殊符号 93 /// </summary> 94 /// <param name="text">字符串</param> 95 /// <returns>返回特殊符号</returns> 96 public static string FilerSymbol(string text) 97 { 98 StringBuilder sb = new StringBuilder(); 99 string symbol = "@,#,$,*,_,&,^,|,\\,/"; 100 string[] symbolGroup = symbol.Split(','); 101 102 foreach (string t in symbolGroup) 103 { 104 int exist = text.IndexOf(t); 105 106 //判断是否存在特殊符号 107 if (exist != -1) 108 { 109 sb.Append(t); 110 sb.Append(","); 111 } 112 } 113 string result = DeleteLastComma(sb.ToString()); 114 115 return result; 116 } 117 #endregion 118 119 #region 自定义的替换字符串函数 120 /// <summary> 121 /// 自定义的替换字符串函数 122 /// </summary> 123 public static string ReplaceSymbol(string text) 124 { 125 string symbol = "@,#,$,*,~,&,^,|,\\,/,%,(,),+,{,},:,;,.,<,>,?,\",',!,[,],`,€"; 126 string[] symbolGroup = symbol.Split(','); 127 128 foreach (string t in symbolGroup) 129 { 130 text = text.Replace(t, "_"); 131 } 132 133 return text.Replace(" ", "").Replace(",", ""); 134 } 135 #endregion 136 137 #region 合并字符 138 /// <summary> 139 /// 合并字符 140 /// </summary> 141 /// <param name="source">要合并的源字符串</param> 142 /// <param name="target">要被合并到的目的字符串</param> 143 /// <returns>合并到的目的字符串</returns> 144 public static string MergeString(string source, string target) 145 { 146 return MergeString(source, target, ","); 147 } 148 149 /// <summary> 150 /// 合并字符 151 /// </summary> 152 /// <param name="source">要合并的源字符串</param> 153 /// <param name="target">要被合并到的目的字符串</param> 154 /// <param name="mergechar">合并符</param> 155 /// <returns>并到字符串</returns> 156 public static string MergeString(string source, string target, string mergechar) 157 { 158 if (String.IsNullOrEmpty(target)) 159 { 160 target = source; 161 } 162 else 163 { 164 target += mergechar + source; 165 } 166 return target; 167 } 168 #endregion 169 170 #region 删除最后一个字符 171 /// <summary> 172 /// 删除最后一个字符 173 /// </summary> 174 /// <param name="str">字符串</param> 175 /// <returns></returns> 176 public static string ClearLastChar(string str) 177 { 178 if (str == "") 179 { 180 return ""; 181 } 182 183 return str.Substring(0, str.Length - 1); 184 } 185 #endregion 186 187 #region 替换回车换行符为html换行符 188 /// <summary> 189 /// 替换回车换行符为html换行符 190 /// </summary> 191 /// <param name="str">字符串</param> 192 /// <returns></returns> 193 public static string StrFormat(string str) 194 { 195 string str2; 196 197 if (str == null) 198 { 199 str2 = ""; 200 } 201 else 202 { 203 str = str.Replace("\r\n", "<br />"); 204 str = str.Replace("\n", "<br />"); 205 str2 = str; 206 } 207 return str2; 208 } 209 #endregion 210 211 #region 删除字符串尾部的回车/换行/空格 212 /// <summary> 213 /// 删除字符串尾部的回车/换行/空格 214 /// </summary> 215 /// <param name="str">字符串</param> 216 /// <returns></returns> 217 public static string RTrim(string str) 218 { 219 for (int i = str.Length; i >= 0; i--) 220 { 221 if (str[i].Equals(" ") || str[i].Equals("\r") || str[i].Equals("\n")) 222 { 223 return str.Remove(i, 1); 224 } 225 } 226 return str; 227 } 228 #endregion 229 230 #region 生成指定数量的html空格符号 231 /// <summary> 232 /// 生成指定数量的html空格符号 233 /// </summary> 234 /// <param name="spacesCount">空格数量</param> 235 /// <returns></returns> 236 public static string GetSpacesString(int spacesCount) 237 { 238 StringBuilder sb = new StringBuilder(); 239 for (int i = 0; i < spacesCount; i++) 240 { 241 sb.Append(" "); 242 } 243 return sb.ToString(); 244 } 245 #endregion 246 247 #region 从字符串的指定位置截取指定长度的子字符串 248 /// <summary> 249 /// 从字符串的指定位置截取指定长度的子字符串 250 /// </summary> 251 /// <param name="str">原字符串</param> 252 /// <param name="startIndex">子字符串的起始位置</param> 253 /// <param name="length">子字符串的长度</param> 254 /// <returns>子字符串</returns> 255 public static string CutString(string str, int startIndex, int length) 256 { 257 if (startIndex >= 0) 258 { 259 if (length < 0) 260 { 261 length = length * -1; 262 if (startIndex - length < 0) 263 { 264 length = startIndex; 265 startIndex = 0; 266 } 267 else 268 { 269 startIndex = startIndex - length; 270 } 271 } 272 273 if (startIndex > str.Length) 274 { 275 return ""; 276 } 277 } 278 else 279 { 280 if (length < 0) 281 { 282 return ""; 283 } 284 285 if (length + startIndex > 0) 286 { 287 length = length + startIndex; 288 startIndex = 0; 289 } 290 else 291 { 292 return ""; 293 } 294 } 295 296 if (str.Length - startIndex < length) 297 { 298 length = str.Length - startIndex; 299 } 300 301 return str.Substring(startIndex, length); 302 } 303 #endregion 304 305 #region 从字符串的指定位置开始截取到字符串结尾的了符串 306 /// <summary> 307 /// 从字符串的指定位置开始截取到字符串结尾的了符串 308 /// </summary> 309 /// <param name="str">原字符串</param> 310 /// <param name="startIndex">子字符串的起始位置</param> 311 /// <returns>子字符串</returns> 312 public static string CutString(string str, int startIndex) 313 { 314 return CutString(str, startIndex, str.Length); 315 } 316 #endregion 317 318 #region 返回字符串真实长度, 1个汉字长度为2 319 /// <summary> 320 /// 返回字符串真实长度, 1个汉字长度为2 321 /// </summary> 322 /// <param name="str">字符串</param> 323 /// <returns>字符长度</returns> 324 public static int GetStringLength(string str) 325 { 326 return Encoding.Default.GetBytes(str).Length; 327 } 328 #endregion 329 330 #region 字符串如果操过指定长度则将超出的部分用指定字符串代替 331 /// <summary> 332 /// 字符串如果操过指定长度则将超出的部分用指定字符串代替 333 /// </summary> 334 /// <param name="p_SrcString">要检查的字符串</param> 335 /// <param name="p_Length">指定长度</param> 336 /// <param name="p_TailString">用于替换的字符串</param> 337 /// <returns>截取后的字符串</returns> 338 public static string GetSubString(string p_SrcString, int p_Length, string p_TailString) 339 { 340 return GetSubString(p_SrcString, 0, p_Length, p_TailString); 341 } 342 #endregion 343 344 #region 取指定长度的字符串 345 /// <summary> 346 /// 取指定长度的字符串 347 /// </summary> 348 /// <param name="p_SrcString">要检查的字符串</param> 349 /// <param name="p_StartIndex">起始位置</param> 350 /// <param name="p_Length">指定长度</param> 351 /// <param name="p_TailString">用于替换的字符串</param> 352 /// <returns>截取后的字符串</returns> 353 public static string GetSubString(string p_SrcString, int p_StartIndex, int p_Length, string p_TailString) 354 { 355 string myResult = p_SrcString; 356 357 Byte[] bComments = Encoding.UTF8.GetBytes(p_SrcString); 358 foreach (char c in Encoding.UTF8.GetChars(bComments)) 359 { 360 //当是日文或韩文时(注:中文的范围:\u4e00 - \u9fa5, 日文在\u0800 - \u4e00, 韩文为\xAC00-\xD7A3) 361 if ((c > '\u0800' && c < '\u4e00') || (c > '\xAC00' && c < '\xD7A3')) 362 { 363 //if (System.Text.RegularExpressions.Regex.IsMatch(p_SrcString, "[\u0800-\u4e00]+") || System.Text.RegularExpressions.Regex.IsMatch(p_SrcString, "[\xAC00-\xD7A3]+")) 364 //当截取的起始位置超出字段串长度时 365 if (p_StartIndex >= p_SrcString.Length) 366 { 367 return ""; 368 } 369 370 return p_SrcString.Substring(p_StartIndex, 371 ((p_Length + p_StartIndex) > p_SrcString.Length) ? (p_SrcString.Length - p_StartIndex) : p_Length); 372 } 373 } 374 375 if (p_Length >= 0) 376 { 377 byte[] bsSrcString = Encoding.Default.GetBytes(p_SrcString); 378 379 //当字符串长度大于起始位置 380 if (bsSrcString.Length > p_StartIndex) 381 { 382 int p_EndIndex = bsSrcString.Length; 383 384 //当要截取的长度在字符串的有效长度范围内 385 if (bsSrcString.Length > (p_StartIndex + p_Length)) 386 { 387 p_EndIndex = p_Length + p_StartIndex; 388 } 389 else 390 { //当不在有效范围内时,只取到字符串的结尾 391 392 p_Length = bsSrcString.Length - p_StartIndex; 393 p_TailString = ""; 394 } 395 396 int nRealLength = p_Length; 397 int[] anResultFlag = new int[p_Length]; 398 399 int nFlag = 0; 400 for (int i = p_StartIndex; i < p_EndIndex; i++) 401 { 402 if (bsSrcString[i] > 127) 403 { 404 nFlag++; 405 if (nFlag == 3) 406 { 407 nFlag = 1; 408 } 409 } 410 else 411 { 412 nFlag = 0; 413 } 414 415 anResultFlag[i] = nFlag; 416 } 417 418 if ((bsSrcString[p_EndIndex - 1] > 127) && (anResultFlag[p_Length - 1] == 1)) 419 { 420 nRealLength = p_Length + 1; 421 } 422 423 byte[] bsResult = new byte[nRealLength]; 424 425 Array.Copy(bsSrcString, p_StartIndex, bsResult, 0, nRealLength); 426 427 myResult = Encoding.Default.GetString(bsResult); 428 429 myResult = myResult + p_TailString; 430 } 431 } 432 433 return myResult; 434 } 435 #endregion 436 437 #region 取指定长度的字符串 中文字符计算加2 438 public static string GetUnicodeSubString(string str, int len, string p_TailString) 439 { 440 string result = String.Empty;// 最终返回的结果 441 int byteLen = Encoding.Default.GetByteCount(str);// 单字节字符长度 442 int charLen = str.Length;// 把字符平等对待时的字符串长度 443 int byteCount = 0;// 记录读取进度 444 int pos = 0;// 记录截取位置 445 if (byteLen > len) 446 { 447 for (int i = 0; i < charLen; i++) 448 { 449 if (Convert.ToInt32(str.ToCharArray()[i]) > 255)// 按中文字符计算加2 450 byteCount += 2; 451 else// 按英文字符计算加1 452 byteCount += 1; 453 if (byteCount > len)// 超出时只记下上一个有效位置 454 { 455 pos = i; 456 break; 457 } 458 459 if (byteCount == len)// 记下当前位置 460 { 461 pos = i + 1; 462 break; 463 } 464 } 465 466 if (pos >= 0) 467 { 468 result = str.Substring(0, pos) + p_TailString; 469 } 470 } 471 else 472 { 473 result = str; 474 } 475 476 return result; 477 } 478 #endregion 479 480 #region 自定义的替换字符串函数 481 /// <summary> 482 /// 自定义的替换字符串函数 483 /// </summary> 484 public static string ReplaceString(string SourceString, string SearchString, string ReplaceString, bool IsCaseInsensetive) 485 { 486 return Regex.Replace(SourceString, Regex.Escape(SearchString), ReplaceString, IsCaseInsensetive ? RegexOptions.IgnoreCase : RegexOptions.None); 487 } 488 #endregion 489 490 #region 过滤危险脚本 491 public static string WipeScript(string html) 492 { 493 Regex regex1 = new Regex(@"<script[\s\s]+</script *>", RegexOptions.IgnoreCase); 494 Regex regex2 = new Regex(@" href *= *[\s\s]*script *:", RegexOptions.IgnoreCase); 495 Regex regex3 = new Regex(@" on[\s\s]*=", RegexOptions.IgnoreCase); 496 Regex regex4 = new Regex(@"<iframe[\s\s]+</iframe *>", RegexOptions.IgnoreCase); 497 Regex regex5 = new Regex(@"<frameset[\s\s]+</frameset *>", RegexOptions.IgnoreCase); 498 html = regex1.Replace(html, ""); //过滤<script></script>标记 499 html = regex2.Replace(html, ""); //过滤href=javascript: (<a>) 属性 500 html = regex3.Replace(html, " _disibledevent="); //过滤其它控件的on...事件 501 html = regex4.Replace(html, ""); //过滤iframe 502 html = regex5.Replace(html, ""); //过滤frameset 503 return html; 504 } 505 #endregion 506 507 #region 分割字符串 508 /// <summary> 509 /// 分割字符串 510 /// </summary> 511 /// <param name="strContent">被分割的字符串</param> 512 /// <param name="strSplit">分隔符</param> 513 /// <returns></returns> 514 public static string[] SplitString(string strContent, string strSplit) 515 { 516 if (!String.IsNullOrEmpty(strContent)) 517 { 518 if (strContent.IndexOf(strSplit) < 0) 519 { 520 string[] tmp = { strContent }; 521 return tmp; 522 } 523 return Regex.Split(strContent, Regex.Escape(strSplit), RegexOptions.IgnoreCase); 524 } 525 526 return new string[] { }; 527 } 528 529 /// <summary> 530 /// 分割字符串 531 /// </summary> 532 /// <param name="strContent">被分割的字符串</param> 533 /// <param name="strSplit">分隔符</param> 534 /// <param name="count">数组的数量</param> 535 /// <returns></returns> 536 public static string[] SplitString(string strContent, string strSplit, int count) 537 { 538 string[] result = new string[count]; 539 540 string[] splited = SplitString(strContent, strSplit); 541 542 for (int i = 0; i < count; i++) 543 { 544 result[i] = i < splited.Length ? splited[i] : String.Empty; 545 } 546 547 return result; 548 } 549 550 /// <summary> 551 /// 分割字符串 552 /// </summary> 553 /// <param name="strContent">被分割的字符串</param> 554 /// <param name="strSplit">分割符</param> 555 /// <param name="ignoreRepeatItem">忽略重复项</param> 556 /// <param name="maxElementLength">单个元素最大长度</param> 557 /// <returns></returns> 558 public static string[] SplitString(string strContent, string strSplit, bool ignoreRepeatItem, int maxElementLength) 559 { 560 string[] result = SplitString(strContent, strSplit); 561 562 return ignoreRepeatItem ? ArrayHelper.DistinctStringArray(result, maxElementLength) : result; 563 } 564 565 public static string[] SplitString(string strContent, string strSplit, bool ignoreRepeatItem, int minElementLength, int maxElementLength) 566 { 567 string[] result = SplitString(strContent, strSplit); 568 569 if (ignoreRepeatItem) 570 { 571 result = ArrayHelper.DistinctStringArray(result); 572 } 573 return ArrayHelper.PadStringArray(result, minElementLength, maxElementLength); 574 } 575 576 /// <summary> 577 /// 分割字符串 578 /// </summary> 579 /// <param name="strContent">被分割的字符串</param> 580 /// <param name="strSplit">分割符</param> 581 /// <param name="ignoreRepeatItem">忽略重复项</param> 582 /// <returns></returns> 583 public static string[] SplitString(string strContent, string strSplit, bool ignoreRepeatItem) 584 { 585 return SplitString(strContent, strSplit, ignoreRepeatItem, 0); 586 } 587 #endregion 588 589 #region 字符串重复 590 /// <summary> 591 /// 字符串重复N倍 592 /// </summary> 593 /// <param name="str"></param> 594 /// <param name="n"></param> 595 /// <returns></returns> 596 public static string RepeatString(string str, int n) 597 { 598 char[] arr = str.ToCharArray(); 599 char[] arrDest = new char[arr.Length * n]; 600 for (int i = 0; i < n; i++) 601 { 602 Buffer.BlockCopy(arr, 0, arrDest, i * arr.Length * 2, arr.Length * 2); 603 } 604 605 return new string(arrDest); 606 } 607 #endregion 608 609 #region Base64解码 610 /// <summary> 611 /// Base64解码 612 /// </summary> 613 /// <param name="str"></param> 614 /// <returns></returns> 615 public static string Base64_Decode(string str) 616 { 617 byte[] bytes = Convert.FromBase64String(str); 618 return Encoding.UTF8.GetString(bytes); 619 } 620 #endregion 621 622 #region Base64编码 623 /// <summary> 624 /// Base64编码 625 /// </summary> 626 /// <param name="str"></param> 627 /// <returns></returns> 628 public static string Base64_Encode(string str) 629 { 630 return Convert.ToBase64String(Encoding.UTF8.GetBytes(str)); 631 } 632 #endregion 633 634 #region 清理无效XML字符 635 /// <summary> 636 /// 清理无效XML字符 637 /// </summary> 638 /// <param name="input"></param> 639 /// <returns></returns> 640 public static string CleanInvalidCharsForXML(string input) 641 { 642 if (String.IsNullOrEmpty(input)) 643 { 644 return input; 645 } 646 StringBuilder builder = new StringBuilder(); 647 char[] chArray = input.ToCharArray(); 648 foreach (char t in chArray) 649 { 650 int num2 = Convert.ToInt32(t); 651 if ((((num2 < 0) || (num2 > 8)) && ((num2 < 11) || (num2 > 12))) && ((num2 < 14) || (num2 > 0x1f))) 652 { 653 builder.Append(t); 654 } 655 } 656 return builder.ToString(); 657 } 658 #endregion 659 660 #region 防SQL注入 661 /// <summary> 662 /// 防SQL注入 663 /// </summary> 664 /// <param name="sql"></param> 665 /// <returns></returns> 666 public static string StripSQLInjection(string sql) 667 { 668 if (!String.IsNullOrEmpty(sql)) 669 { 670 string pattern = @"(\%27)|(\')|(\-\-)"; 671 string str2 = @"((\%27)|(\'))\s*((\%6F)|o|(\%4F))((\%72)|r|(\%52))"; 672 string str3 = @"\s+exec(\s|\+)+(s|x)p\w+"; 673 sql = Regex.Replace(sql, pattern, String.Empty, RegexOptions.IgnoreCase); 674 sql = Regex.Replace(sql, str2, String.Empty, RegexOptions.IgnoreCase); 675 sql = Regex.Replace(sql, str3, String.Empty, RegexOptions.IgnoreCase); 676 } 677 return sql; 678 } 679 #endregion 680 681 #region 截取字符 682 public static string Trim(string stringTrim, int maxLength) 683 { 684 return Trim(stringTrim, maxLength, "..."); 685 } 686 687 public static string Trim(string rawString, int maxLength, string appendString) 688 { 689 if (String.IsNullOrEmpty(rawString) || (rawString.Length <= maxLength)) 690 { 691 return rawString; 692 } 693 if (Encoding.UTF8.GetBytes(rawString).Length <= (maxLength * 2)) 694 { 695 return rawString; 696 } 697 int length = Encoding.UTF8.GetBytes(appendString).Length; 698 StringBuilder builder = new StringBuilder(); 699 int num3 = 0; 700 foreach (char ch in rawString) 701 { 702 builder.Append(ch); 703 num3 += Encoding.Default.GetBytes(new[] { ch }).Length; 704 if (num3 >= ((maxLength * 2) - length)) 705 { 706 break; 707 } 708 } 709 return (builder + appendString); 710 } 711 #endregion 712 713 #region 生成时间截 714 public static string GenerateTimeStamp() 715 { 716 TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); 717 return Convert.ToInt64(ts.TotalSeconds).ToString(); 718 } 719 #endregion 720 721 #region 替换sql语句中的有问题符号 722 /// <summary> 723 /// 替换sql语句中的有问题符号 724 /// </summary> 725 public static string ChkSQL(string str) 726 { 727 return (str == null) ? "" : str.Replace("'", "''"); 728 } 729 #endregion 730 731 #region 替换手机号和邮箱中间几位 732 /// <summary> 733 /// 替换手机号中间四位为* 734 /// </summary> 735 /// <param name="phoneNo"></param> 736 /// <returns></returns> 737 public static string ReturnPhoneNO(string phoneNo) 738 { 739 Regex re = new Regex(@"(\d{3})(\d{4})(\d{4})", RegexOptions.None); 740 phoneNo = re.Replace(phoneNo, "$1****$3"); 741 return phoneNo; 742 } 743 744 /// <summary> 745 /// 替换邮箱中间几位为*号 746 /// </summary> 747 /// <param name="Email"></param> 748 /// <returns></returns> 749 public static string ReturnEmail(string Email) 750 { 751 Regex re = new Regex(@"\w{3}(?=@\w+?.\S+)", RegexOptions.None); 752 Email = re.Replace(Email, "****"); 753 return Email; 754 } 755 #endregion 756 } 757 }