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 交流!



评论一下吧
取消回复