using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Web; namespace Tede.Data.Tests.Utils { public static class StringUtils { public static string GetCacheKey(string nameofClass, params string[] values) { var key = $"SS.Caching.{nameofClass}"; if (values == null || values.Length <= 0) return key; return values.Aggregate(key, (current, t) => current + ("." + t)); } public static string GetContentTableName(int siteId) { return $"siteserver_Content_{siteId}"; } public static bool Equals(string s1, string s2) { return s1 == s2 || string.IsNullOrEmpty(s1) && string.IsNullOrEmpty(s2); } public static bool EqualsIgnoreCase(string s1, string s2) { if (string.IsNullOrEmpty(s1) && string.IsNullOrEmpty(s2)) return true; if (string.IsNullOrEmpty(s1) || string.IsNullOrEmpty(s2) || s2.Length != s1.Length) return false; return string.Compare(s1, 0, s2, 0, s2.Length, StringComparison.OrdinalIgnoreCase) == 0; } public static bool EndsWith(string s, char c) { int length = s.Length; if (length != 0) return (int)s[length - 1] == (int)c; return false; } public static bool EndsWithIgnoreCase(string s1, string s2) { int indexA = s1.Length - s2.Length; if (indexA < 0) return false; return string.Compare(s1, indexA, s2, 0, s2.Length, StringComparison.OrdinalIgnoreCase) == 0; } public static bool StartsWith(string s, char c) { if (s.Length != 0) return (int)s[0] == (int)c; return false; } public static bool StartsWithIgnoreCase(string s1, string s2) { if (string.IsNullOrEmpty(s1) || string.IsNullOrEmpty(s2) || s2.Length > s1.Length) return false; return string.Compare(s1, 0, s2, 0, s2.Length, StringComparison.OrdinalIgnoreCase) == 0; } public static bool ArrayEquals(string[] a, string[] b) { if (a == null != (b == null)) return false; if (a == null) return true; int length = a.Length; if (length != b.Length) return false; for (int index = 0; index < length; ++index) { if (a[index] != b[index]) return false; } return true; } public static string[] ObjectArrayToStringArray(object[] objectArray) { string[] strArray = new string[objectArray.Length]; objectArray.CopyTo((Array)strArray, 0); return strArray; } //------------------------------// public static bool IsMobile(string val) { return Regex.IsMatch(val, @"^1[3456789]\d{9}$", RegexOptions.IgnoreCase); } public static bool IsEmail(string val) { return Regex.IsMatch(val, @"^\w+([-_+.]\w+)*@\w+([-_.]\w+)*\.\w+([-_.]\w+)*$", RegexOptions.IgnoreCase); } public static bool IsNumber(string val) { const string formatNumber = "^[0-9]+$"; return Regex.IsMatch(val, formatNumber); } public static bool IsDateTime(string val) { const string formatDate = @"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$"; const string formatDateTime = @"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$"; return Regex.IsMatch(val, formatDate) || Regex.IsMatch(val, formatDateTime); } public static bool In(string strCollection, int inInt) { return In(strCollection, inInt.ToString()); } public static bool In(string strCollection, string inStr) { if (string.IsNullOrEmpty(strCollection)) return false; return strCollection == inStr || strCollection.StartsWith(inStr + ",") || strCollection.EndsWith("," + inStr) || strCollection.IndexOf("," + inStr + ",", StringComparison.Ordinal) != -1; } public static bool Contains(string text, string inner) { return text?.IndexOf(inner, StringComparison.Ordinal) >= 0; } public static bool ContainsIgnoreCase(string text, string inner) { if (string.IsNullOrEmpty(text) || string.IsNullOrEmpty(inner)) return false; return text.ToLower().IndexOf(inner.ToLower(), StringComparison.Ordinal) >= 0; } public static bool ContainsIgnoreCase(IList list, string target) { if (list == null || list.Count == 0) return false; return list.Any(element => EqualsIgnoreCase(element, target)); } public static string Trim(string text) { return string.IsNullOrEmpty(text) ? string.Empty : text.Trim(); } public static string TrimSlash(string text) { return string.IsNullOrEmpty(text) ? string.Empty : text.Trim().Trim('/'); } public static string TrimAndToLower(string text) { return string.IsNullOrEmpty(text) ? string.Empty : text.ToLower().Trim(); } public static string Remove(string text, int startIndex) { if (string.IsNullOrEmpty(text)) return string.Empty; if (startIndex < 0) { throw new ArgumentOutOfRangeException(nameof(startIndex)); } if (startIndex >= text.Length) { throw new ArgumentOutOfRangeException(nameof(startIndex)); } return text.Substring(0, startIndex); } public static string GetGuid() { return Guid.NewGuid().ToString(); } public static string GetShortGuid() { long i = 1; foreach (var b in System.Guid.NewGuid().ToByteArray()) { i *= b + 1; } return $"{i - DateTime.Now.Ticks:x}"; } public static string GetShortGuid(bool isUppercase) { long i = 1; foreach (var b in System.Guid.NewGuid().ToByteArray()) { i *= b + 1; } string retval = $"{i - DateTime.Now.Ticks:x}"; return isUppercase ? retval.ToUpper() : retval.ToLower(); } public static bool EqualsIgnoreNull(string a, string b) { return string.IsNullOrEmpty(a) ? string.IsNullOrEmpty(b) : string.Equals(a, b); } public static bool StartsWith(string text, string startString) { if (string.IsNullOrEmpty(text) || string.IsNullOrEmpty(startString)) return false; return text.StartsWith(startString); } public static bool EndsWith(string text, string endString) { if (string.IsNullOrEmpty(text) || string.IsNullOrEmpty(endString)) return false; return text.EndsWith(endString); } public static void InsertBefore(string[] insertBeforeArray, StringBuilder contentBuilder, string insertContent) { if (contentBuilder == null) return; foreach (var insertBefore in insertBeforeArray) { if (contentBuilder.ToString().IndexOf(insertBefore, StringComparison.Ordinal) != -1) { InsertBefore(insertBefore, contentBuilder, insertContent); return; } } } private static void InsertBefore(string insertBefore, StringBuilder contentBuilder, string insertContent) { if (string.IsNullOrEmpty(insertBefore) || contentBuilder == null) return; var startIndex = contentBuilder.ToString().IndexOf(insertBefore, StringComparison.Ordinal); if (startIndex != -1) { contentBuilder.Insert(startIndex, insertContent); } } public static void InsertAfter(string[] insertAfterArray, StringBuilder contentBuilder, string insertContent) { if (contentBuilder != null) { foreach (var insertAfter in insertAfterArray) { if (contentBuilder.ToString().IndexOf(insertAfter, StringComparison.Ordinal) != -1) { InsertAfter(insertAfter, contentBuilder, insertContent); return; } } } } private static void InsertAfter(string insertAfter, StringBuilder contentBuilder, string insertContent) { if (string.IsNullOrEmpty(insertAfter) || contentBuilder == null) return; var startIndex = contentBuilder.ToString().IndexOf(insertAfter, StringComparison.Ordinal); if (startIndex == -1) return; if (startIndex != -1) { contentBuilder.Insert(startIndex + insertAfter.Length, insertContent); } } public static string HtmlDecode(string inputString) { return HttpUtility.HtmlDecode(inputString); } public static string HtmlEncode(string inputString) { return HttpUtility.HtmlEncode(inputString); } public static string ToXmlContent(string inputString) { var contentBuilder = new StringBuilder(inputString); contentBuilder.Replace("", string.Empty); contentBuilder.Insert(0, ""); return contentBuilder.ToString(); } public static string ReplaceIgnoreCase(string original, string pattern, string replacement) { if (original == null) return string.Empty; if (replacement == null) replacement = string.Empty; var count = 0; var position0 = 0; int position1; var upperString = original.ToUpper(); var upperPattern = pattern.ToUpper(); var inc = (original.Length / pattern.Length) * (replacement.Length - pattern.Length); var chars = new char[original.Length + Math.Max(0, inc)]; while ((position1 = upperString.IndexOf(upperPattern, position0, StringComparison.Ordinal)) != -1) { for (var i = position0; i < position1; ++i) chars[count++] = original[i]; foreach (var t in replacement) { chars[count++] = t; } position0 = position1 + pattern.Length; } if (position0 == 0) return original; for (var i = position0; i < original.Length; ++i) chars[count++] = original[i]; return new string(chars, 0, count); } public static string Replace(string replace, string input, string to) { var retval = RegexUtils.Replace(replace, input, to); if (string.IsNullOrEmpty(replace)) return retval; if (replace.StartsWith("/") && replace.EndsWith("/")) { retval = RegexUtils.Replace(replace.Trim('/'), input, to); } else { retval = input.Replace(replace, to); } return retval; } public static void ReplaceHrefOrSrc(StringBuilder builder, string replace, string to) { builder.Replace("href=\"" + replace, "href=\"" + to); builder.Replace("href='" + replace, "href='" + to); builder.Replace("href=" + replace, "href=" + to); builder.Replace("href="" + replace, "href="" + to); builder.Replace("src=\"" + replace, "src=\"" + to); builder.Replace("src='" + replace, "src='" + to); builder.Replace("src=" + replace, "src=" + to); builder.Replace("src="" + replace, "src="" + to); } public static string ReplaceFirst(string replace, string input, string to) { var pos = input.IndexOf(replace, StringComparison.Ordinal); if (pos > 0) { //取位置前部分+替换字符串+位置(加上查找字符长度)后部分 return input.Substring(0, pos) + to + input.Substring(pos + replace.Length); } if (pos == 0) { return to + input.Substring(replace.Length); } return input; } public static string ReplaceStartsWith(string input, string replace, string to) { var retVal = input; if (!string.IsNullOrEmpty(input) && !string.IsNullOrEmpty(replace) && input.StartsWith(replace)) { retVal = to + input.Substring(replace.Length); } return retVal; } public static string ReplaceStartsWithIgnoreCase(string input, string replace, string to) { var retVal = input; if (!string.IsNullOrEmpty(input) && !string.IsNullOrEmpty(replace) && input.ToLower().StartsWith(replace.ToLower())) { retVal = to + input.Substring(replace.Length); } return retVal; } public static string ReplaceEndsWith(string input, string replace, string to) { var retVal = input; if (!string.IsNullOrEmpty(input) && !string.IsNullOrEmpty(replace) && input.EndsWith(replace)) { retVal = input.Substring(0, input.Length - replace.Length) + to; } return retVal; } public static string ReplaceEndsWithIgnoreCase(string input, string replace, string to) { var retVal = input; if (!string.IsNullOrEmpty(input) && !string.IsNullOrEmpty(replace) && input.ToLower().EndsWith(replace.ToLower())) { retVal = input.Substring(0, input.Length - replace.Length) + to; } return retVal; } public static string ReplaceNewlineToBr(string inputString) { if (string.IsNullOrEmpty(inputString)) return string.Empty; var retVal = new StringBuilder(); inputString = inputString.Trim(); foreach (var t in inputString) { switch (t) { case '\n': retVal.Append("
"); break; case '\r': break; default: retVal.Append(t); break; } } return retVal.ToString(); } public static string ReplaceNewline(string inputString, string replacement) { if (string.IsNullOrEmpty(inputString)) return string.Empty; var retVal = new StringBuilder(); inputString = inputString.Trim(); foreach (var t in inputString) { switch (t) { case '\n': retVal.Append(replacement); break; case '\r': break; default: retVal.Append(t); break; } } return retVal.ToString(); } private static Encoding Gb2312 { get; } = Encoding.GetEncoding("gb2312"); private static bool IsTwoBytesChar(char chr) { // 使用中文支持编码 return Gb2312.GetByteCount(new[] { chr }) == 2; } /// /// 得到innerText在content中的数目 /// /// /// /// public static int GetCount(string innerText, string content) { if (innerText == null || content == null) { return 0; } var count = 0; for (var index = content.IndexOf(innerText, StringComparison.Ordinal); index != -1; index = content.IndexOf(innerText, index + innerText.Length, StringComparison.Ordinal)) { count++; } return count; } public static int GetStartCount(char startChar, string content) { if (content == null) { return 0; } var count = 0; foreach (var theChar in content) { if (theChar == startChar) { count++; } else { break; } } return count; } public static int GetStartCount(string startString, string content) { if (content == null) { return 0; } var count = 0; while (true) { if (content.StartsWith(startString)) { count++; content = content.Remove(0, startString.Length); } else { break; } } return count; } public static string GetFirstOfStringCollection(string collection, char separator) { if (!string.IsNullOrEmpty(collection)) { var index = collection.IndexOf(separator); return index == -1 ? collection : collection.Substring(0, index); } return string.Empty; } private static int _randomSeq; public static int GetRandomInt(int minValue, int maxValue) { var ro = new Random(unchecked((int)DateTime.Now.Ticks)); var retval = ro.Next(minValue, maxValue); retval += _randomSeq++; if (retval >= maxValue) { _randomSeq = 0; retval = minValue; } return retval; } public static string ValueToUrl(string value) { var retval = string.Empty; if (!string.IsNullOrEmpty(value)) { //替换url中的换行符,update by sessionliang at 20151211 retval = value.Replace("=", "_equals_").Replace("&", "_and_").Replace("?", "_question_").Replace("'", "_quote_").Replace("+", "_add_").Replace("\r", "").Replace("\n", ""); } return retval; } public static string ValueFromUrl(string value) { var retval = string.Empty; if (!string.IsNullOrEmpty(value)) { retval = value.Replace("_equals_", "=").Replace("_and_", "&").Replace("_question_", "?").Replace("_quote_", "'").Replace("_add_", "+"); } return retval; } public static string ToJsString(string value) { var retval = string.Empty; if (!string.IsNullOrEmpty(value)) { retval = value.Replace("'", @"\'").Replace("\r", "\\r").Replace("\n", "\\n"); } return retval; } public static string ParseReplace(string parsedContent, string replace, string to) { if (replace.IndexOf(',') != -1) { var replaceList = TranslateUtils.StringCollectionToStringList(replace); var toList = TranslateUtils.StringCollectionToStringList(to); if (replaceList.Count == toList.Count) { for (var i = 0; i < replaceList.Count; i++) { parsedContent = parsedContent.Replace(replaceList[i], toList[i]); } return parsedContent; } if (toList.Count == 1) { foreach (var replaceStr in replaceList) { parsedContent = parsedContent.Replace(replaceStr, to); } return parsedContent; } } string retval; if (replace.StartsWith("/") && replace.EndsWith("/")) { retval = RegexUtils.Replace(replace.Trim('/'), parsedContent, to); } else { retval = parsedContent.Replace(replace, to); } return retval; } public static string GetTrueImageHtml(string isDefaultStr) { return GetTrueImageHtml(TranslateUtils.ToBool(isDefaultStr)); } private static string GetTrueImageHtml(bool isDefault) { var retval = string.Empty; if (isDefault) { retval = ""; } return retval; } public static string LowerFirst(string input) { if (string.IsNullOrEmpty(input)) return string.Empty; return input.First().ToString().ToLower() + input.Substring(1); } } }