上一篇说到:为了可扩展与方便大伙,我定义了一个抽象类,先实现了三个正则用于截取标题,说明,和关键字。
抽象类代码简洁如下:

public abstract class ReplaceTextListBase
{
/// <summary>
/// 将被返回的替换文本集合列表
/// </summary>
public Dictionary<string, string> replaceTextList = new Dictionary<string, string>();
/// <summary>
/// 获取当前请求页面的url信息
/// </summary>
public Uri PageUrl { get { return HttpContext.Current.Request.Url; } }
/// <summary>
/// 获取html的title的正则
/// </summary>
public string TitleRegex { get { return "<title.*>.*</title>"; } }
public string TitleFormat(string titleText)
{
return "<title>" + titleText + "</title>";
}
/// <summary>
/// 获取html的Description的正则
/// </summary>
public string DescriptionRegex { get { return "<meta[^<>]+name=[\"\']description[^<>]*[/]>"; } }
public string DescriptionFormat(string descriptionText)
{
return "<meta id=\"description\" name=\"description\" content=\"" + descriptionText + "\" />";
}
/// <summary>
/// 获取html的Keyword的正则
/// </summary>
public string KeywordRegex { get { return "<meta[^<>]+name=[\"\']keywords[^<>]*[/]>"; } }
public string KeywordFormat(string keywordText)
{
return "<meta id=\"keywords\" name=\"keywords\" content=\"" + keywordText + "\" />";
}
/// <summary>
/// 复写此方法,调用replaceTextList.add()方法后,return replaceTextList;
/// </summary>
/// <returns></returns>
public virtual Dictionary<string, string> GetReplaceTextList()
{
return replaceTextList;
}
}
{
/// <summary>
/// 将被返回的替换文本集合列表
/// </summary>
public Dictionary<string, string> replaceTextList = new Dictionary<string, string>();
/// <summary>
/// 获取当前请求页面的url信息
/// </summary>
public Uri PageUrl { get { return HttpContext.Current.Request.Url; } }
/// <summary>
/// 获取html的title的正则
/// </summary>
public string TitleRegex { get { return "<title.*>.*</title>"; } }
public string TitleFormat(string titleText)
{
return "<title>" + titleText + "</title>";
}
/// <summary>
/// 获取html的Description的正则
/// </summary>
public string DescriptionRegex { get { return "<meta[^<>]+name=[\"\']description[^<>]*[/]>"; } }
public string DescriptionFormat(string descriptionText)
{
return "<meta id=\"description\" name=\"description\" content=\"" + descriptionText + "\" />";
}
/// <summary>
/// 获取html的Keyword的正则
/// </summary>
public string KeywordRegex { get { return "<meta[^<>]+name=[\"\']keywords[^<>]*[/]>"; } }
public string KeywordFormat(string keywordText)
{
return "<meta id=\"keywords\" name=\"keywords\" content=\"" + keywordText + "\" />";
}
/// <summary>
/// 复写此方法,调用replaceTextList.add()方法后,return replaceTextList;
/// </summary>
/// <returns></returns>
public virtual Dictionary<string, string> GetReplaceTextList()
{
return replaceTextList;
}
}
抽象类后,留下一个虚方法GetReplaceTextList(), 这是重点
现在看一下我的示例中的子类的实现,继承自抽象类,复写虚方法:

public class ReplaceTextList:ReplaceTextListBase
{
public override System.Collections.Generic.Dictionary<string, string> GetReplaceTextList()
{
replaceTextList.Add(TitleRegex,TitleFormat("TitleRegex"));
replaceTextList.Add(DescriptionRegex,DescriptionFormat("descriptionttest"));
replaceTextList.Add(KeywordRegex,KeywordFormat("keywordadfdfdf"));
return replaceTextList;
}
}
{
public override System.Collections.Generic.Dictionary<string, string> GetReplaceTextList()
{
replaceTextList.Add(TitleRegex,TitleFormat("TitleRegex"));
replaceTextList.Add(DescriptionRegex,DescriptionFormat("descriptionttest"));
replaceTextList.Add(KeywordRegex,KeywordFormat("keywordadfdfdf"));
return replaceTextList;
}
}
代码解析:
例子中的子类实现很简单,就复写了一个虚方法,最终页面的输出标题为:TitleRegex。其它两个同理。
如果要替换其它或过滤文件,只要写多几个add方法把要替换的文字给替换掉就行了,具体也可以结合下数据库或其它文件操作
如果要替换其它或过滤文件,只要写多几个add方法把要替换的文字给替换掉就行了,具体也可以结合下数据库或其它文件操作
另外说明:
例子上,直接就定死了标题输出为:TitleRegex,这里可以结合自己的需要,替换成任意字符串。
提示:抽象类里还留下了PageUr吧,可以根据Url查出Title和description和keyword来实现自己的扩展。
提示:抽象类里还留下了PageUr吧,可以根据Url查出Title和description和keyword来实现自己的扩展。
另外给出一些我早期实现的思路:
建数据库表,对url主机头进行分类管理,自己定义替换字符等,最后查询与替换。
版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。 |
个人微信公众号![]() |
Donation(扫码支持作者):支付宝:![]() |
Donation(扫码支持作者):微信:![]() |
![]() |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)