一个复杂的替换字符串问题(SEO常要用到)

duangjian001 2009-08-13 08:57:23
现在网站经常要给文章里的关键字自动加链接。。所在这里就涉及到给指定关键字加链接,替换字符串问题





如我的文章为:


str1 = "我想学习c语言教程,我想看的是C语言视频教程,其它什么C语言教程,我都不想看。我喜欢C语言"


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

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



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

1.只替换第一次匹配的关键字,给其增加链接,即被<a>标签包含着,且A标签中有title属性,title属性的值就是被匹配关键字
2.虽然匹配,但该被匹配的字符串,被<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语言”




请问这个代码怎么实现。。。求教了。。




...全文
182 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
syjwbl 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lxcnn 的回复:]
其实看到楼主前一个帖子的时候,我已经实现了,只不过实现方法从简洁度到匹配效率,都让我自己不满意,所以就没贴,看到楼主又发帖,那么先拿去凑合着用吧,我看看想办法再优化一下

C# code//委托方法List<string> tags=new List<string>(newstring[] {"c语言视频教程","C语言教程","c语言" });//关键字如果可能出现包含关系,被包含的放在后面int length=0;string temp=string.Empty;string t=string.Empty;
List<string> list=new List<string>();privatestring RegReplace(Match m)
{
temp= m.Value;
length= temp.Length;foreach (string tagin tags)
{
t= Regex.Escape(tag);
temp= Regex.Replace(temp,@"(?is)^((?:(?:(?!"+ t+@"|</?a\b).)*<a\b(?:(?!</?a\b).)*</a>)*(?:(?!"+ t+@"|</?a\b).)*)(?<tag>"+ Regex.Escape(tag)+@")",@"$1<a href=""http://www.21shipin.com"" target=""_blank"" title=""${tag}"">${tag}</a>");if (length!= temp.Length)
{
list.Add(tag);
}
length= temp.Length;
}foreach (string sin list)
{
tags.Remove(s);
}
list.Clear();return temp;
}//调用string str1="我想学习c语言教程,我想看的是C语言视频教程,其它什么C语言教程,我都不想看。我喜欢C语言";
Regex reg=new Regex(@"(?i)(?:^|(?<!<a\b(?>[^<>]*))>)(?>[^<>]*)(?:<|$)");string result= reg.Replace(str1, RegReplace);
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]
这个很不错啊。我就是用的这个方法。
-过客- 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 duangjian001 的回复:]
太复杂了。。有没有简单点的啦。。。。唉。。求。。。
[/Quote]

有没有简单点的需求?
duangjian001 2009-08-14
  • 打赏
  • 举报
回复
太复杂了。。有没有简单点的啦。。。。唉。。求。。。
slund 2009-08-13
  • 打赏
  • 举报
回复
学习。
SK_Aqi 2009-08-13
  • 打赏
  • 举报
回复
学习了!!!
你们正则怎么写的呢?
望高手指点
lfcms 2009-08-13
  • 打赏
  • 举报
回复
路过 学习滴。
woying5510 2009-08-13
  • 打赏
  • 举报
回复
2L好猛
支持啊
jiangshun 2009-08-13
  • 打赏
  • 举报
回复
正则好强哦
cpp2017 2009-08-13
  • 打赏
  • 举报
回复
1楼的不用看了,不严谨,看过客的.
-过客- 2009-08-13
  • 打赏
  • 举报
回复
其实看到楼主前一个帖子的时候,我已经实现了,只不过实现方法从简洁度到匹配效率,都让我自己不满意,所以就没贴,看到楼主又发帖,那么先拿去凑合着用吧,我看看想办法再优化一下

//委托方法
List<string> tags = new List<string>(new string[] { "c语言视频教程", "C语言教程", "c语言" }); //关键字如果可能出现包含关系,被包含的放在后面
int length = 0;
string temp = string.Empty;
string t = string.Empty;
List<string> list = new List<string>();
private string RegReplace(Match m)
{
temp = m.Value;
length = temp.Length;
foreach (string tag in tags)
{
t = Regex.Escape(tag);
temp = Regex.Replace(temp, @"(?is)^((?:(?:(?!" + t + @"|</?a\b).)*<a\b(?:(?!</?a\b).)*</a>)*(?:(?!" + t + @"|</?a\b).)*)(?<tag>" + Regex.Escape(tag) + @")", @"$1<a href=""http://www.21shipin.com"" target=""_blank"" title=""${tag}"">${tag}</a>");
if (length != temp.Length)
{
list.Add(tag);
}
length = temp.Length;
}
foreach (string s in list)
{
tags.Remove(s);
}
list.Clear();
return temp;
}
//调用
string str1 = "我想学习c语言教程,我想看的是C语言视频教程,其它什么C语言教程,我都不想看。我喜欢C语言";
Regex reg = new Regex(@"(?i)(?:^|(?<!<a\b(?>[^<>]*))>)(?>[^<>]*)(?:<|$)");
string result = reg.Replace(str1, RegReplace);
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语言


另外楼主所给例子的结果中有几处是错误的,应该是笔误吧,先测下我的代码是否能满足你的需求吧
cpp2017 2009-08-13
  • 打赏
  • 举报
回复
   string str1 = "我想学习c语言教程,我想看的是C语言视频教程,其它什么C语言教程,我都不想看。我喜欢C语言";

str1 = System.Text.RegularExpressions.Regex.Replace(str1, @"(?<!c语言教程[\s\S]*)(c语言教程)(?![^>]*>)", "<a href=\"http://www.21shipin.com\" title=\"$1\">$1</a>", RegexOptions.IgnoreCase);
Response.Write(str1);

62,074

社区成员

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

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

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

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