替换文章关键字程序—优化

路人乙e 2009-06-04 05:58:46
加精
思想:
对一篇文章查找搜索关键字,并进行替换,变成链接形式

要求:
1、标签内的内容不参与替换,比如:<p title="关键字"> 虽然含有关键字,但不进行替换
2、本身是链接的内容不参与替换,如:<a>关键字</a>
3、<pre></pre>标签内的内容不参与替换,如:<pre>关键字</pre>
3、尽量做到一个关键字在一篇文章中只有一个被替换成链接(因为关键字很多,都替换成链接,整篇文章十分不雅)

本人代码实现如下:

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();
}

结果是比较满意,可有一个严重的问题——速度太慢
请高手进行优化,或更改一下思路
...全文
2629 142 打赏 收藏 转发到动态 举报
写回复
用AI写文章
142 条回复
切换为时间正序
请发表友善的回复…
发表回复
xh23303377 2011-09-02
  • 打赏
  • 举报
回复
up!
shen1990shen 2011-07-24
  • 打赏
  • 举报
回复
mark
muksun 2011-06-30
  • 打赏
  • 举报
回复
回帖是一种美德!每天回帖即可获得 10 分可用分!

http://topic.csdn.net/u/20090601/14/10eb5d82-b3d7-40a3-a53e-f1f2216dc332.html 我先记下来,回头看!
mengbo2008bj 2011-05-23
  • 打赏
  • 举报
回复
收藏,up
wuqianghappy 2011-05-19
  • 打赏
  • 举报
回复
17写的太精了,虽然看不懂什么意思,就是感觉好啊! 哈哈!
支持一下楼主!
naqing250 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lxcnn 的回复:]
reg2 = new Regex(@"(?<=(?:^|>)(?:(?!" + Regex.Escape(_tag) + ").)*)" + Regex.Escape(_tag) , RegexOptions.IgnoreCase);
[/Quote]
如何过滤关键字替换出来的,加连接的关键字呀???
智星 2010-09-03
  • 打赏
  • 举报
回复
支持一下.学习了.
  • 打赏
  • 举报
回复
结果是比较满意,可有一个严重的问题——速度太慢
请高手进行优化,或更改一下思路
ayf_net 2010-08-27
  • 打赏
  • 举报
回复
学习了
haa17 2010-08-06
  • 打赏
  • 举报
回复
好贴 值得收藏
snopo 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 89 楼 pilotedit 的回复:]

楼主啊,你搞得太复杂了。

对文章的每个单词(n个)和每个关键字(m个)组合进行正则表达式的查找。当然很慢了。

可以这样做,先把不要替换的关键字换掉,比如

<p title="关键字">换成<p title="关####键字">
<a>关键字 </a>换成<a>关####键字 </a>
<pre>关键字 </pre>换成<pre>关####键字 </pre>

然后查找“……
[/Quote]


这个思路其实很不错,正着走效率低,为何不换种思维,反着做呢?
-过客- 2010-08-06
  • 打赏
  • 举报
回复
原来写的是有点小Bug,最新的参考这个帖子

求解正则表达式修改

如果仍有不满足的,给出实例,我继续改进
路人乙e 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 134 楼 ccb8888 的回复:]

不知道是不是BUG。。。
过客写的:(?:^|(?<!<(?:a)\b(?>[^<>]*))>)(?>[^<>]*)(?:<|$)

这个正则会匹配字符窜“<a>*****</a> ”中**里面的内容
[/Quote]

很久了,隐约记得有点小问题,不过已经修正了:)
ccb8888 2010-08-06
  • 打赏
  • 举报
回复
不知道是不是BUG。。。
过客写的:(?:^|(?<!<(?:a)\b(?>[^<>]*))>)(?>[^<>]*)(?:<|$)

这个正则会匹配字符窜“<a>*****</a> ”中**里面的内容
ayf_net 2010-07-22
  • 打赏
  • 举报
回复
来的有点迟 还是顶起
无敌西瓜 2010-01-29
  • 打赏
  • 举报
回复
不错,学习了下呵呵。
xiaoyaowp 2010-01-29
  • 打赏
  • 举报
回复
mark
richu0209 2009-11-27
  • 打赏
  • 举报
回复
弱弱的观贴!
randomfeel 2009-10-28
  • 打赏
  • 举报
回复
mark
Tortoise1023 2009-09-27
  • 打赏
  • 举报
回复
看来是个好东西。。回去看看
加载更多回复(122)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧