首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

C# 字符串工具類:截取、過濾、格式驗證、IP獲取全能助手

     編輯:更多程式設計知識

字符串處理是業務代碼中最高頻的操作之一。本文整理一個静态类 StringHelper,涵蓋:按字節截取(中英文混排)、SQL 注入過濾、Email/URL/IP 格式驗證、客戶端 IP 獲取、全半角數字轉換、枚舉標誌位判斷等 10+ 實用方法,代碼緊湊、註釋清晰,可直接納入項目公共庫。

方法清單速查

方法功能備註
GetSubString按字節截取,超長尾部加「...」GB2312 編碼,中文 2 字節
GetSub1String按字節截取,不加省略號同上
ProcessSqlStrSQL 關鍵字黑名單過濾返回 bool,true=安全
IsSafeSqlString正則檢測危險字符(單引號、分號等)返回 bool
mashSQL單引號轉義('→'')簡易防注入
IsValidEmailEmail 格式正則驗證返回 bool
IsURLURL 格式正則驗證(支持 IP/域名/端口/路徑)返回 bool
GetIP獲取客戶端真實 IP依次讀取 HTTP_X_FORWARDED_FOR / REMOTE_ADDR / UserHostAddress
IsIPIPv4 格式正則驗證返回 bool
SBCCaseToNumberic全角數字(0-9)轉半角(0-9)Unicode 碼位偏移實現
CheckFlagsEnumEquals位枚舉值包含判斷(checking & expected) == expected

核心實現亮點

1. 按字節精準截取(中英文混排)

public static string GetSubString(string origStr, int endIndex) {
    if (string.IsNullOrEmpty(origStr) || endIndex < 0) return "";
    int bytesCount = Encoding.GetEncoding("gb2312").GetByteCount(origStr);
    if (bytesCount <= endIndex) return origStr;
    int readyLength = 0;
    for (int i = 0; i < origStr.Length; i++) {
        int byteLength = Encoding.GetEncoding("gb2312").GetByteCount(new char[] { origStr[i] });
        readyLength += byteLength;
        if (readyLength >= endIndex) {
            return origStr.Substring(0, readyLength == endIndex ? i + 1 : i) + "...";
        }
    }
    return origStr;
}

逐字符累加字節數,精準截斷於字節邊界,避免半個漢字亂碼。

2. SQL 防注入多層防禦

  • ProcessSqlStr:關鍵字黑名單(exec、insert、select、drop、script、iframe…)
  • IsSafeSqlString:字符級白名單正則 ^[-|;|,|/|(|)|[|]|}|{|%|@|*|!|']
  • mashSQL:單引號雙寫轉義

最佳實踐:請優先使用參數化查詢 (SqlParameter) 或 ORM,僅在無法參數化的舊代碼中作為補充過濾。

3. 客戶端 IP 獲取鏈路

public static string GetIP() {
    string result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    if (string.IsNullOrEmpty(result))
        result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
    if (string.IsNullOrEmpty(result))
        result = HttpContext.Current.Request.UserHostAddress;
    return (string.IsNullOrEmpty(result) || !IsIP(result)) ? "0.0.0.0" : result;
}

兼容反向代理 (Nginx/IIS ARR) 的 X-Forwarded-For 標頭。

4. 全角數字轉半角

利用 Unicode 編碼特性:全角數字碼位比半角大 0xFEE0 (65248),代碼通過 Encoding.Unicode.GetBytes 檢測高位字節為 0xFF (255) 並減去 32 (0x20) 實現轉換。

使用示例

// 列表頁標題截取
string title = StringHelper.GetSubString(article.Title, 40); // "這是一個很長的標題..."

// 表單提交前過濾
if (!StringHelper.ProcessSqlStr(userInput)) throw new Exception("輸入包含非法字符");

// 登錄日誌記錄 IP
string ip = StringHelper.GetIP();

// 枚舉權限判斷
[Flags] enum Perm { Read=1, Write=2, Execute=4 }
Perm userPerm = Perm.Read | Perm.Write;
bool canWrite = StringHelper.CheckFlagsEnumEquals(userPerm, Perm.Write); // true

遷移提示

  • .NET Core / 5+ 項目中 HttpContext.Current 不可用,請改用 IHttpContextAccessor 注入獲取 HttpContext。
  • 編碼名「gb2312」在 .NET Core 需註冊 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) 並引用 System.Text.Encoding.CodePages 包。
  • 正則模式建議預編譯 RegexOptions.Compiled 提升高頻調用性能。

將 StringHelper 加入公共庫,即可在 Controller、Service、Middleware 中輕鬆調用,減少重復造輪子。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved