求。给文章关键字加链接函数。非常复杂。

duangjian12009 2009-10-28 01:59:58
现在网站经常要给文章里的关键字自动加链接。。所在这里就涉及

到给指定关键字加链接,替换字符串问题


如我的文章为:


str1 = "我想学习c语言教程,我想看的是C语言视频教程,其它什

么C语言教程,我都不想看。我喜欢C语言"


我要替换的关键字数组为:

str2 ={c语言视频教程,C语言教程,c语言};


替换加链接的关键字规则如下:

1.只替换第一次匹配的关键字,给其增加链接,即使其被 <a>标

签包含着,且A标签中有title属性,title属性的值就是被匹配关

键字

注意:
1.虽然匹配,但该被匹配的字符串,被 <a>标签包含着,或是a标

签中的title属性的值,则跳过,




希望最后替换后的结果为:

str1 = “我想习学 <a href="http://www.21shipin.com"

target="_blank" title="C语言教程">c语言教程</a>,我想看的

是 <a href="http://www.21shipin.com" target="_blank"

title="C语言视频教程">C语言视频教程 </a>,其它什么 <a

href="http://www.21shipin.com" target="_blank" title="C语

言">C语言 </a>教程,我都不想看。我喜欢C语言”


请问这个功能怎么实现。。。求教了。。


最好写成一下函数。。头痛。为这个弄一半个月了。。。



...全文
701 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
q876284004 2012-07-11
  • 打赏
  • 举报
回复
alert
shixiaopan 2010-05-17
  • 打赏
  • 举报
回复
如果是不同的关键字, 对应不同的链接怎么做,
duangjian 2009-11-05
  • 打赏
  • 举报
回复
Sandy945,和过客

有空帮我看看啊。。
duangjian 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 liherun 的回复:]
楼主 Sandy945,和过客应该给分的吧
[/Quote]

绝对要给。。。
duangjian 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 liherun 的回复:]
楼主 Sandy945,和过客应该给分的吧
[/Quote]

绝对要给。。。
wxd024 2009-11-05
  • 打赏
  • 举报
回复
帮顶,关注
liherun 2009-11-05
  • 打赏
  • 举报
回复
楼主 Sandy945,和过客应该给分的吧
duangjian 2009-11-05
  • 打赏
  • 举报
回复
求高人。。。
wjn161 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 lxcnn 的回复:]
楼主两个月以前的帖子中我已经给实现了
一个复杂的替换字符串问题(SEO常要用到)
但是楼主说复杂,不知道楼主的复杂指的是代码逻辑复杂,还是正则复杂

其实楼主的需求本身就很复杂,如果以正则来实现,这种复杂度是免不了的

当然也可以自己写有穷自动机来实现,因为没有正则这么抽象,逻辑会清晰得多,但是代码会很长,开发效率也自然降下来了

对上一帖中的实现方法做了些优化
C# codestring str1="我想学习c语言教程,我想看的是C语言视频教程,其它什么C语言教程,我都不想看。我喜欢C语言";
Regex reg=new Regex(@"(?i)(?:^|(?<!<a\b(?>[^<>]*))>)(?>[^<>]*)(?:<|$)");//如果关键字有包含关系时,要求被包含的关键字在前List<string> tags=new List<string>(newstring[] {"c语言","C语言教程","c语言视频教程" });int length=0;string temp=string.Empty;string result= reg.Replace(str1,delegate(Match m)
{
temp= m.Value;
length= temp.Length;for (int i= tags.Count-1; i>=0; i--)
{
temp= Regex.Replace(temp,@"(?is)^((?:(?:(?!"+ Regex.Escape(tags[i])+@"|</?a\b).)*<a\b(?:(?!</?a\b).)*</a>)*(?:(?!"+ Regex.Escape(tags[i])+@"|</?a\b).)*)(?<tag>"+ Regex.Escape(tags[i])+@")",@"$1<a href=""http://www.21shipin.com"" target=""_blank"" title=""${tag}"">${tag}</a>");if (length!= temp.Length)
{
tags.Remove(tags[i]);
}
length= temp.Length;
}return temp;
});
richTextBox2.Text= result;/*------------输出------------
我想学习<a href="http://www.21shipin.com" target="_blank" title="c语言教程">c语言教程</a>,我想看的是<a href="http://www.21shipin.com" target="_blank" title="C语言视频教程">C语言视频教程</a>,其它什么<a href="http://www.21shipin.com" target="_blank" title="C语言">C语言</a>教程,我都不想看。我喜欢C语言*/
[/Quote]

非常精彩的正则匹配和匿名方法.第一眼看看到委托感到非常困惑,后来才觉悟了~
可惜楼主你的.NET1.1不支持匿名方法和泛型啊. 泛型的话你可以用非泛型版本,只是效率大打折扣,匿名方法的话我也不知道怎么改了~
duangjian 2009-11-04
  • 打赏
  • 举报
回复
求高人啊。。
duangjian 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 caobob 的回复:]
正则替换
[/Quote]

就是不会啊。。。晕。。呵呵。
caobob 2009-11-04
  • 打赏
  • 举报
回复
正则替换
duangjian 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sandy945 的回复:]
C# codepublicstring FilterStr(string value, IList<string> filterList,bool isIgnoreCase,bool isReplaceAll)
{string returnValue= value;string constFilter="~!@##@!~";for (int i=0; i< filterList.C?-
[/Quote]

谢谢朋友,但是还有一点小问题:


就是这个,规则还有一点点问题,.虽然匹配,但该被匹配的字符串,被 <a>标签包含着,或是a标签中的title属性的值,则跳过


这个还是有点问题。。


但原来的文章中查个关键字本身已有链接,但还是会替换。。。
duangjian 2009-11-04
  • 打赏
  • 举报
回复
我的是.net 1.1

很多东东都不能用啊。。唉郁闷。。
fuda_1985 2009-10-31
  • 打赏
  • 举报
回复
方法盗走了~
-过客- 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 duangjian12009 的回复:]
最好写成一下函数。。头痛。为这个弄一半个月了。。。
[/Quote]
写成方法也一样


/// <summary>
/// 给关键字加链接,同一关键字只加一次
/// </summary>
/// <param name="src">源字符串</param>
/// <param name="keys">关键字泛型</param>
/// <returns>替换后结果</returns>
private string keyAddUrl(string src, List<string> keys)
{
Regex reg = new Regex(@"(?i)(?:^|(?<!<a\b(?>[^<>]*))>)(?>[^<>]*)(?:<|$)");
int length = 0;
string temp = string.Empty;
return reg.Replace(src, delegate(Match m)
{
temp = m.Value;
length = temp.Length;
for (int i = keys.Count - 1; i >= 0; i--)
{
temp = Regex.Replace(temp, @"(?is)^((?:(?:(?!" + Regex.Escape(keys[i]) + @"|</?a\b).)*<a\b(?:(?!</?a\b).)*</a>)*(?:(?!" + Regex.Escape(keys[i]) + @"|</?a\b).)*)(?<tag>" + Regex.Escape(keys[i]) + @")", @"$1<a href=""http://www.21shipin.com"" target=""_blank"" title=""${tag}"">${tag}</a>");
if (length != temp.Length)
{
keys.Remove(keys[i]);
}
length = temp.Length;
}
return temp;
});
}
//调用
string str1 = "我想学习c语言教程,我想看的是C语言视频教程,其它什么C语言教程,我都不想看。我喜欢C语言";
List<string> keys = new List<string>(new string[] { "c语言", "C语言教程", "c语言视频教程" });
string result = keyAddUrl(str1, keys);
richTextBox2.Text = result;
/*------------输出------------
我想学习<a href="http://www.21shipin.com" target="_blank" title="c语言教程">c语言教程</a>,我想看的是<a href="http://www.21shipin.com" target="_blank" title="C语言视频教程">C语言视频教程</a>,其它什么<a href="http://www.21shipin.com" target="_blank" title="C语言">C语言</a>教程,我都不想看。我喜欢C语言
*/
阿非 2009-10-30
  • 打赏
  • 举报
回复
用 indexOf 判断是否等于 -1
-1 表示 不包含
-过客- 2009-10-30
  • 打赏
  • 举报
回复
楼主两个月以前的帖子中我已经给实现了
一个复杂的替换字符串问题(SEO常要用到)
但是楼主说复杂,不知道楼主的复杂指的是代码逻辑复杂,还是正则复杂

其实楼主的需求本身就很复杂,如果以正则来实现,这种复杂度是免不了的

当然也可以自己写有穷自动机来实现,因为没有正则这么抽象,逻辑会清晰得多,但是代码会很长,开发效率也自然降下来了

对上一帖中的实现方法做了些优化
string str1 = "我想学习c语言教程,我想看的是C语言视频教程,其它什么C语言教程,我都不想看。我喜欢C语言";
Regex reg = new Regex(@"(?i)(?:^|(?<!<a\b(?>[^<>]*))>)(?>[^<>]*)(?:<|$)");
//如果关键字有包含关系时,要求被包含的关键字在前
List<string> tags = new List<string>(new string[] { "c语言", "C语言教程", "c语言视频教程" });
int length = 0;
string temp = string.Empty;
string result = reg.Replace(str1, delegate(Match m)
{
temp = m.Value;
length = temp.Length;
for (int i = tags.Count - 1; i >= 0; i--)
{
temp = Regex.Replace(temp, @"(?is)^((?:(?:(?!" + Regex.Escape(tags[i]) + @"|</?a\b).)*<a\b(?:(?!</?a\b).)*</a>)*(?:(?!" + Regex.Escape(tags[i]) + @"|</?a\b).)*)(?<tag>" + Regex.Escape(tags[i]) + @")", @"$1<a href=""http://www.21shipin.com"" target=""_blank"" title=""${tag}"">${tag}</a>");
if (length != temp.Length)
{
tags.Remove(tags[i]);
}
length = temp.Length;
}
return temp;
});
richTextBox2.Text = result;
/*------------输出------------
我想学习<a href="http://www.21shipin.com" target="_blank" title="c语言教程">c语言教程</a>,我想看的是<a href="http://www.21shipin.com" target="_blank" title="C语言视频教程">C语言视频教程</a>,其它什么<a href="http://www.21shipin.com" target="_blank" title="C语言">C语言</a>教程,我都不想看。我喜欢C语言
*/
C5662601 2009-10-30
  • 打赏
  • 举报
回复
学习
duangjian12009 2009-10-30
  • 打赏
  • 举报
回复
string 不包含对Contains定义。。。

我的是vs2003??咋搞???请教啊。。
加载更多回复(19)

62,051

社区成员

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

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

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

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