扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
思想:
对一篇文章查找搜索关键字,并进行替换,变成链接形式
要求:
1、标签内的内容不参与替换,比如: <p title="关键字"> 虽然含有关键字,但不进行替换
2、本身是链接的内容不参与替换,如: <a>关键字 </a>
3、 <pre> </pre>标签内的内容不参与替换,如: <pre>关键字 </pre>
3、尽量做到一个关键字在一篇文章中只有一个被替换成链接(因为关键字很多,都替换成链接,整篇文章十分不雅)
本人代码实现如下:
C# code
public static string FormatBody(string body)
{
Regex reg = new Regex(@"(<a .+?</a>)|(<pre(>|\s).+?</pre>)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
Match mat = reg.Match(body);
List<string> str1 = new List<string>();
List<string> str2 = new List<string>();
int indx = 0;
while (mat.Success)
{
str1.Add(body.Substring(indx, mat.Index - indx));
str2.Add(mat.Value);
indx = mat.Index + mat.Length;
mat = reg.Match(body, indx);
}
str1.Add(body.Substring(indx));
str2.Add("");
StringBuilder sb = new StringBuilder();
int p = 50, cnt, len;
StringBuilder tmp;
Regex reg2;
Match mat2;
for (int i = 0; i < str1.Count; i++)
{
tmp = new StringBuilder(str1[i]);
if (Regex.Replace(tmp.ToString(), @"<.+?>", "").Length > 5)
{
cnt = tmp.Length / p;
len = 0;
foreach (string _tag in Tag.AllTags)//AllTags包含了站内所有关键字
{
//str = Regex.Replace(str, @"([^<]+?)(" + _tag + ")", "$1<a href='/tag/$2.htm'>$2</a>", RegexOptions.IgnoreCase);
reg2 = new Regex(@"((^|>)[^<]+?)(" + _tag + ")", RegexOptions.IgnoreCase);
mat2 = reg2.Match(tmp.ToString());
if (mat2.Success)
{
tmp.Remove(mat2.Index, mat2.Length);
tmp.Insert(mat2.Index, mat2.Groups[1].Value + "<a href='/tag/" + mat2.Groups[2].Value + ".htm'>" + mat2.Groups[2].Value + "</a>");
if (++len > cnt) break;
}
}
}
sb.Append(tmp.ToString());
sb.Append(str2[i]);
}
return sb.ToString();
}
结果是比较满意,可有一个严重的问题——速度太慢
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者