C# 正则表达式实战:从 EMLOG 爬虫数据清洗到防喷子插件开发实录

大家好,我是零点。最近在研究 EMLOG 的核心插件开发,发现很多兄弟在写后端接口和爬虫时,对正则表达式的理解还停留在基础层面。其实,这玩意儿是后端开发的“瑞士军刀”,用好了能省下大把去调接口的时间。

今天这期干货,咱们不扯虚的,直接上实战。我结合了自己写 C# 爬虫和防御 SQL 注入的经验,手把手拆解一下正则表达式在实际项目中的应用场景。

一、 拿数据:爬虫里的正则提取技巧

最近在做数据迁移,需要把旧站 EMLOG 的文章标题抓出来。面对杂乱的 HTML 原生输出,直接解析 DOM 倒不如写个正则来得快。

场景还原: 比如我们要从一段 HTML 中提取所有标题标签里的文本。

public string ExtractTitles(string htmlContent)
{
    // 模式解释:
    // <h1>    匹配标签开始
    // ([^<]+)  非贪婪匹配,捕获除<以外的所有字符
    // </h1>    匹配标签结束
    string pattern = @"<h1>([^<]+)</h1>";

    MatchCollection matches = Regex.Matches(htmlContent, pattern, RegexOptions.IgnoreCase);

    StringBuilder sb = new StringBuilder();
    foreach (Match match in matches)
    {
        sb.AppendLine(match.Groups[1].Value); // 输出捕获组
    }
    return sb.ToString();
}

这段代码虽然简单,但在我做 C# 接口开发 做数据清洗时非常实用。只要写一次,以后处理任何 HTML 片段都能直接复用。

二、 安全盾:防喷子插件里的正则清洗

做过MySQL 开发的都知道,用户输入永远不可信。很多时候防 SQL 注入只靠后端的参数化查询(预处理语句)还不够,必须在入库前对用户的评论做一层“正则清洗”。

比如我们要过滤掉包含脚本标签或恶意跳转链接的评论:

string userComment = Request.Form["content"];

// 过滤 <script> 标签及其内容
string scriptPattern = @"<script[^>]*>.*?</script>";
userComment = Regex.Replace(userComment, scriptPattern, string.Empty, RegexOptions.IgnoreCase);

// 过滤 eval() 等危险函数调用
string dangerPattern = @"eval\s*\(\s*[^\)]+\)";
userComment = Regex.Replace(userComment, dangerPattern, string.Empty);

// 使用预处理语句插入数据库(省略具体代码,安全第一)
// Prepare("INSERT INTO comments (...) VALUES (...)")

这一步结合了SQL注入防护,是零点博客建站安全体系中必不可少的一环。

三、 底层避坑:JSON 解析与正则的相爱相杀

有时候我们拿到的是非标准 JSON 或是包含特殊字符的字符串,直接 `JObject.Parse` 可能会报错。这时候又得请出正则表达式来辅助处理。

举个例子,爬取第三方接口返回的字符串,其中包含一些动态生成的 Key。正则表达式可以帮我们把目标数据单独剥离出来,再进行后续的解析或存入MySQL

实战小技巧: 在处理多行文本时,记得加上 `RegexOptions.Multiline`,否则 `^` 和 `$` 只能匹配首尾,而无法匹配每一行的行首行尾。

四、 总结与建议

不要试图背下所有正则语法,那样会让你头秃。记住几个常用的量词(* ? +)和常用符号,在实际写代码时,使用在线正则测试工具先跑通逻辑,再嵌入到 C# 或 PHP 项目中。

  • 前端配合: 在 JS 端用正则做第一轮过滤,减轻后端压力。
  • 后端兜底: 无论前端怎么验,后端正则清洗 + SQL 预处理是绝对的安全底线。

希望这篇基于零点博客实战经验的复盘能帮到你。下次写爬虫遇到拿不到数据的情况,记得先写个正则把 HTML 结构“解剖”一下。代码已上传至源码仓库,欢迎 star 交流!