<!DOCTYPE html>

C# 正则表达式实战:EMLOG 爬虫开发到 SQL 防注入的底层避坑指南

C# 正则表达式实战:EMLOG 爬虫开发到 SQL 防注入的底层避坑指南

你好,我是零点博客的博主。在搞 C# 后端开发、EMLOG 插件开发以及爬虫项目时,正则表达式 简直是双刃剑。用好了是神器,用不好就是内存泄漏和服务器 CPU 占满的元凶。今天咱们不整虚的,直接结合实战案例,聊聊如何在爬虫解析和 MySQL 防注入中把正则用明白。

一、爬虫开发中的 HTML 解析:别再傻傻拼字符串了

在做爬虫开发时,我们经常需要从抓取到的 HTML 片段中提取关键信息。很多新人喜欢用 `Split` 或者 `Substring` 截取,这就非常难受了。使用 C# 自带的 System.Text.RegularExpressions 才是正解。

实操案例:提取网页中的文章标题

假设我们通过 HTTP 请求拿到了一堆乱糟糟的 HTML 代码,需要提取出标题。咱们直接上代码:

using System.Text.RegularExpressions;

string htmlContent = "

我的C#爬虫第一课

"; // 定义正则表达式,贪婪匹配内容 string pattern = @"]*>(.*?)"; Match match = Regex.Match(htmlContent, pattern, RegexOptions.IgnoreCase); if (match.Success) { Console.WriteLine("抓取到的标题:" + match.Groups[1].Value); }

这段代码就是最基础的爬虫解析逻辑。虽然遇到大体积的 HTML 用正则性能不如 HtmlAgilityPack,但对于抓取 XML 或者 API 返回的特定字段,正则表达式 依然不可替代。

二、数据清洗与 JSON/XML 解析

我们在处理接口开发时,对方返回的 JSON 数据可能包含一些多余的空格或者非预期的换行符。这时候正则又是清理数据的好帮手。

比如我们需要把 JSON 中的换行符替换成空格,或者去除字符串两端的空白:

string jsonStr = @"{
    "id": 1,
    "name": "测试"
}";

// 去除两端换行和空白
string cleanJson = Regex.Replace(jsonStr, @"\s*", "");

// 替换特定字段中的非法字符(视业务需求而定)
string cleanJson2 = Regex.Replace(jsonStr, @"[
]+", " ");

三、MySQL 防注入防护与正则验证的误区

这是很多开发者容易混淆的地方。说到防 SQL 注入,大家首先想到的是预处理语句,这没错。但正则表达式 在这里扮演什么角色呢?

误区警示

千万不要指望用正则表达式来彻底堵住 SQL 注入!正则只能用来做格式验证(比如验证邮箱格式、手机号是否合法、检查参数是否包含单引号 `'`)。如果用户传入的是 `1' OR '1'='1`,正则甚至可能匹配不到。

在开发 EMLOG 插件时,如果用户输入了邮箱地址存储到 MySQL 数据库,我们可以先用正则验证格式:

bool isValidEmail = Regex.IsMatch(email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");

if (!isValidEmail)
{
    return json: { "status": "error", "msg": "邮箱格式错误" };
}

// 格式对了,再走预处理语句存入 MySQL,这才是安全姿势。

四、底层避坑指南:正则性能与回溯陷阱

作为一个资深码农,我必须强调:正则写得好不好,看性能。 很多时候服务器报警 CPU 飙升,就是因为正则写得太“弱智”,触发了回溯。

比如写一个能匹配重复字符的正则,如果量词写成 `.*`,一旦遇到长文本,电脑直接卡死。建议在写复杂的正则时:

  1. 尽量避免使用 `.*` 这种贪婪模式,除非必要。
  2. 使用“非贪婪模式” `.*?` 帮助引擎尽快停止匹配。
  3. 对于复杂的爬虫,能用正则就正则,复杂的 HTML 建议用解析库。

五、总结与源码下载

今天的分享主要围绕 C# 中的 正则表达式,从爬虫开发的数据提取,到 MySQL 插件开发中的数据清洗与格式校验。记得:正则只负责格式,预处理语句负责防注入,两者分工明确才能写出高质量的代码。

为了方便大家测试,我整理了一个包含上述所有案例的 Demo 工程(模拟 EMLOG 插件结构),想看源码的小伙伴可以关注零点博客并回复关键词 RegexDemo 获取。