问题描述
现在网站经常要给文章里的关键字自动加链接。。所在这里就涉及到给指定关键字加链接,替换字符串问题如我的文章为:str1="我想学习c语言教程,我想看的是C语言视频教程,其它什么C语言教程,我都不想看。我喜欢C语言"我要替换的关键字数组为:a1={c语言视频教程,C语言教程,c语言};对应网址数组为:a2={a1.html,a2.html,a3.html};替换加链接的关键字规则如下:1.只替换第一次匹配的关键字,给其增加链接,即使其被<a>标签包含着,且A标签中有title属性,title属性的值就是被匹配关键字2.虽然匹配,但该被匹配的字符串,被<a>标签包含着,或是a标签中的title属性的值,则跳过,(这个非常重要,不管是字符串本身就包括链接,还是后来被前期替换而包含链接的,总是只要关键字被<A>包含着,就跳过)3.我用的是vs2003,所以有很多朋友写的都用不了。在这里再次谢谢过客,及Sandy945,虽然因为我是1.1的用不了,但还是万分感谢。希望最后替换后的结果为:str1=“我想习学<ahref="http://www.21shipin.com"target="_blank"title="C语言教程">c语言教程</a>,我想看的是<ahref="http://www.21shipin.com"target="_blank"title="C语言视频教程">C语言视频教程</a>,其它什么<ahref="http://www.21shipin.com"target="_blank"title="C语言">C语言</a>教程,我都不想看。我喜欢C语言”请问这个功能怎么实现。。。求教了。。最好写成一下函数。。头痛。为这个弄一半个月了。。。
解决方案
解决方案二:
使用ArrayList或Hashtable一样使用
解决方案三:
ArrayList或Hashtable
解决方案四:
ArrayList或Hashtable同意
解决方案五:
用正则会比较容易,而且你这个还要注意顺序;{c语言、C语言教程、c语言视频教程},这样的顺序,反过来你会看到不希望的结果,因为满足“c语言视频教程”这个条件的同时满足前面两个条件。stringstr="c语言、C语言教程、c语言视频教程";当然不用正则也可以。str=str.ReplaceAll("c语言","<ahref="http://www.21shipin.com"target="_blank"title="C语言">C语言</a>");str=str.ReplaceAll("C语言教程","<ahref="http://www.21shipin.com"target="_blank"title="C语言教程">C语言教程</a>");str=str.ReplaceAll("C语言视频教程","<ahref="http://www.21shipin.com"target="_blank"title="C语言视频教程">C语言视频教程</a>教");
解决方案六:
为了提高效率,建议使用StringBuilder,可以用一个类建议源字符串和替换字符串的映射关系,然后用List<T>保存所有可能集合。
解决方案七:
ArrayList用这个吧,2003里这个很好用的
解决方案八:
已经好些年不用VS2003了,现在也不搞开发,哪些支持哪些不支持也记得不是很清楚了VS2003中匿名方法不支持,但好像委托还是支持的,这样试下吧//替换方法privatestringkeyAddUrl(stringsrc,ArrayListkeys){Regexreg=newRegex(@"(?i)(?:^|(?<!<ab(?>[^<>]*))>)(?>[^<>]*)(?:<|$)");returnreg.Replace(src,newMatchEvaluator(replaceKey));}intlength=0;stringtemp=string.Empty;ArrayListkeys=newArrayList(newstring[]{"c语言","C语言教程","c语言视频教程"});privatestringreplaceKey(Matchm){temp=m.Value;length=temp.Length;for(inti=keys.Count-1;i>=0;i--){temp=Regex.Replace(temp,@"(?is)^((?:(?:(?!"+Regex.Escape(keys[i].ToString())+@"|</?ab).)*<ab(?:(?!</?ab).)*</a>)*(?:(?!"+Regex.Escape(keys[i].ToString())+@"|</?ab).)*)(?<tag>"+Regex.Escape(keys[i].ToString())+@")",@"$1<ahref=""http://www.21shipin.com""target=""_blank""title=""${tag}"">${tag}</a>");if(length!=temp.Length){keys.Remove(keys[i]);}length=temp.Length;}returntemp;}//调用stringstr1="我想学习c语言教程,我想看的是C语言视频教程,其它什么C语言教程,我都不想看。我喜欢C语言";stringresult=keyAddUrl(str1,keys);richTextBox2.Text=result;/*------------输出------------我想学习<ahref="http://www.21shipin.com"target="_blank"title="c语言教程">c语言教程</a>,我想看的是<ahref="http://www.21shipin.com"target="_blank"title="C语言视频教程">C语言视频教程</a>,其它什么<ahref="http://www.21shipin.com"target="_blank"title="C语言">C语言</a>教程,我都不想看。我喜欢C语言*/
说明:1、这里的关键字还是要求顺序的,要求被包含的放在前面2、由于VS2003的限制,只能使用全局变量,如果是局部变量,因每次调用都需要重新声明,降低效率3、由于不能使用泛型,只能使用ArrayList,需要做类型转换,同样会降低效率4、由于楼主需求的复杂性,正则表达式必须动态生成,同样会带来效率损失试下看能不能用吧,如果不能用,哪里报错,报什么错给一下
解决方案九:
Mark
解决方案十:
感谢过客,有一个小问题。。如果我的字符串本身被链接包含着,应该是跳过的,但是仍然会加链接。如我的字符串是:stringstr1=”我想学习c语言教程,我想看的是C语言视频教程,其它什么<ahref="http://www.21shipin.com"target="_blank"title="C语言">C语言教程</a>,我都不想看。我喜欢C语言“结果应该:stringstr1=“我想学习<ahref="http://www.21shipin.com"target="_blank"title="c语言教程">c语言教程</a>,我想看的是<ahref="http://www.21shipin.com"target="_blank"title="C语言视频教程">C语言视频教程</a>,其它什么C语言教程,我都不想看。我喜欢<ahref="http://www.21shipin.com"target="_blank"title="C语言">C语言”</a>“
解决方案十一:
该回复于2010-01-19 17:23:36被版主删除
解决方案十二:
试下看看这样满不满足你的需求//Regexreg=newRegex(@"(?i)(?:^|(?<!<ab(?>[^<>]*))>)(?>[^<>]*)(?:<|$)");//改为Regexreg=newRegex(@"(?i)(?:^|(?<!<ab[^<>]*)>)(?>[^<>]*)(?=<|$)");
解决方案十三:
感觉正则应该更快点
解决方案十四:
ArrylistHashTable正则也可以up
解决方案十五:
引用11楼lxcnn的回复:
试下看看这样满不满足你的需求C#code//Regexreg=newRegex(@"(?i)(?:^|(?<!<ab(?>[^<>]*))>)(?>[^<>]*)(?:<|$)");//改为Regexreg=newRegex(@"(?i)(?:^|(?<!<ab[^<>]*)>)(?>[^<>]*)(?=<|$)");
OK.可以。。不过我给每个关键字加个动态链接地址时,加上不去。郁闷啊。。还是对正则不懂。。呵呵如下面的,我增加了一个链接地址数组,使得不同的关键字链接对应的页面,,如何加进去呢?privatestringkeyAddUrl(stringsrc,ArrayListkeys){Regexreg=newRegex(@"(?i)(?:^|(?<!<ab[^<>]*)>)(?>[^<>]*)(?=<|$)");returnreg.Replace(src,newMatchEvaluator(replaceKey));}intlength=0;stringtemp1=string.Empty;ArrayListkeys=newArrayList(newstring[]{"c语言","C语言教程","c语言视频教程"});ArrayListkeys1=newArrayList(newstring[]{"a.html","b.html","c.html"});privatestringreplaceKey(Matchm){temp1=m.Value;length=temp1.Length;for(inti=keys.Count-1;i>=0;i--){temp1=Regex.Replace(temp1,@"(?is)^((?:(?:(?!"+Regex.Escape(keys[i].ToString())+@"|</?ab).)*<ab(?:(?!</?ab).)*</a>)*(?:(?!"+Regex.Escape(keys[i].ToString())+@"|</?ab).)*)(?<tag>"+Regex.Escape(keys[i].ToString())+@")",@"$1<ahref=""http://www.21shipin.com""target=""_blank""title=""${tag}"">${tag}</a>");if(length!=temp1.Length){keys.Remove(keys[i]);}length=temp1.Length;}returntemp1;}
解决方案:
是不是这种效果?//替换方法privatestringkeyAddUrl(stringsrc,ArrayListkeys){Regexreg=newRegex(@"(?i)(?:^|(?<!<ab[^<>]*)>)(?>[^<>]*)(?=<|$)");for(inti=0;i<keys.Count;i++){hs.Add(keys[i],keys1[i]);}returnreg.Replace(src,newMatchEvaluator(replaceKey));}intlength=0;stringtemp=string.Empty;ArrayListkeys=newArrayList(newstring[]{"c语言","C语言教程","c语言视频教程"});ArrayListkeys1=newArrayList(newstring[]{"a.html","b.html","c.html"});Hashtablehs=newHashtable();privatestringreplaceKey(Matchm){temp=m.Value;length=temp.Length;for(inti=keys.Count-1;i>=0;i--){temp=Regex.Replace(temp,@"(?is)^((?:(?:(?!"+Regex.Escape(keys[i].ToString())+@"|</?ab).)*<ab(?:(?!</?ab).)*</a>)*(?:(?!"+Regex.Escape(keys[i].ToString())+@"|</?ab).)*)(?<tag>"+Regex.Escape(keys[i].ToString())+@")",@"$1<ahref=""http://www.21shipin.com/"+hs[keys[i]].ToString()+@"""target=""_blank""title=""${tag}"">${tag}</a>");if(length!=temp.Length){keys.Remove(keys[i]);}length=temp.Length;}returntemp;}//调用stringstr1="我想学习c语言教程,我想看的是C语言视频教程,其它什么<ahref="http://www.21shipin.com"target="_blank"title="C语言">C语言教程</a>,我都不想看。我喜欢C语言";stringresult=keyAddUrl(str1,keys);richTextBox2.Text=result;/*------------输出------------我想学习<ahref="http://www.21shipin.com/b.html"target="_blank"title="c语言教程">c语言教程</a>,我想看的是<ahref="http://www.21shipin.com/c.html"target="_blank"title="C语言视频教程">C语言视频教程</a>,其它什么<ahref="http://www.21shipin.com"target="_blank"title="C语言">C语言教程</a>,我都不想看。我喜欢<ahref="http://www.21shipin.com/a.html"target="_blank"title="C语言">C语言</a>*/
解决方案:
顶下。。
解决方案:
引用16楼duangjian的回复:
顶下。。
15楼是否满足需求?
解决方案:
还没有解决?下面给你解决的思路,其他代码部分就不写了。protectedstringTiHuan(stringNr){ArrayListHeChen=newArrayList();string[]NeiRong=newstring[1];stringZuHeNeiRong="";NeiRong=Nr.Split('<');//首先分割出for(intii=0;ii<NeiRong.Length;ii++){if(NeiRong[ii].IndexOf("a")<0&&NeiRong[ii].IndexOf("A")<=0)//过滤掉包含指定字符串的内容{HeChen.Add(NeiRong[ii].ToString());}//得到不包含超链接的内容}HeChen得到内容有2个如下:/*我想学习c语言教程,我想看的是C语言视频教程,我喜欢C语言,我想习学/a>',其它什么C语言教程,我都不想看。*/for(inti1=0;i1<HeChen.Count;i1++){ZuHeNeiRong+=HeChen[i1].ToString();}NeiRong=ZuHeNeiRong.Split('>');//首先分割出,如果需要就再次分割后,再进行组合后输出给字符串关键字加超链接处理,其实这一步已经不需要了,因为包含字符串/a>'已不给替换造成影响了。returnZuHeNeiRong;}
解决方案:
stringnr="我想学习c语言教程,我想看的是C语言视频教程,我喜欢C语言,我想习学<ahref='http://www.21shipin.com'target='_blank'title='C语言教程'>c语言教程</a>',其它什么C语言教程,我都不想看。";TiHuan(nr);
解决方案:
UP
解决方案:
根据我的网站,把程序修改如下:ArrayListkeys=newArrayList();ArrayListkeys1=newArrayList();Hashtablehs=newHashtable();publicstringaddTag(stringcontents){Open();SqlDataAdapteradapter=newSqlDataAdapter("select*fromtag",myConnection);DataTabledt=newDataTable();adapter.Fill(dt);for(inti=0;i<dt.Rows.Count;i++){keys.Add(dt.Rows[i]["tagTitle"].ToString().Trim());keys1.Add(dt.Rows[i]["tagUrl"].ToString().Trim());}contents=keyAddUrl(contents,keys);keys.Clear();keys1.Clear();hs.Clear();returncontents;}privatestringkeyAddUrl(stringsrc,ArrayListkeys){Regexreg=newRegex(@"(?i)(?:^|(?<!<ab[^<>]*)>)(?>[^<>]*)(?=<|$)");for(inti=0;i<keys.Count;i++){hs.Add(keys[i],keys1[i]);}returnreg.Replace(src,newMatchEvaluator(replaceKey));}intlength=0;stringtemp1=string.Empty;privatestringreplaceKey(Matchm){temp1=m.Value;length=temp1.Length;for(inti=keys.Count-1;i>=0;i--){temp1=Regex.Replace(temp1,@"(?is)^((?:(?:(?!"+Regex.Escape(keys[i].ToString())+@"|</?ab).)*<ab(?:(?!</?ab).)*</a>)*(?:(?!"+Regex.Escape(keys[i].ToString())+@"|</?ab).)*)(?<tag>"+Regex.Escape(keys[i].ToString())+@")",@"$1<ahref=""http://www.21shipin.com/"+hs[keys[i]].ToString()+@"""target=""_blank""title=""${tag}"">${tag}</a>");if(length!=temp1.Length){keys.Remove(keys[i]);}length=temp1.Length;}returntemp1;}可是一直报ServiceUnavailable我晕,我哭。。。。
解决方案:
=高人啊。。
解决方案:
啥也不说了收藏了
解决方案:
还没解决?用2个傍晚调试终于实现了。输出内容如下:我想学习<ahref='a2.html'target='_blank'title='C语言教程'>C语言教程</a>,我想看的是<ahref='a1.html'target='_blank'title='C语言视频教程'>C语言视频教程</a>,我喜欢C语言,我想习学<ahref='http://www.21shipin.com'target='_blank'title='C语言教程'>C语言教程</a>,其它什么<ahref='a2.html'target='_blank'title='C语言教程'>C语言教程</a>,我都不想看。哈哈。。。。。。。。。。。。。对这个问题太感兴趣了。调试也很辛苦啊,如果还没有解决问题,需要的话找我,如果已经解决则付之一笑,当练手了。
解决方案:
我想学习<ahref='a2.html'target='_blank'title='C语言教程'>C语言教程</a>,我想看的是<ahref='a1.html'target='_blank'title='C语言视频教程'>C语言视频教程</a>,我喜欢<ahref='a3.html'target='_blank'title='C语言'>C语言</a>,我想习学<ahref='http://www.21shipin.com'target='_blank'title='C语言教程'>C语言教程</a>,其它什么<ahref='a2.html'target='_blank'title='C语言教程'>C语言教程</a>,我都不想看。
解决方案:
mark一下!!
解决方案:
解决方案:
引用27楼xianfajushi的回复:
http://blog.csdn.net/xianfajushi/archive/2009/11/11/4787050.aspx
1.只替换第一次匹配的关键有个这点小问题。
解决方案:
测试过了每个关键字都替换了你是怎么测试的我怀疑哦?
解决方案:
你新建一个页面把代码原封不动复制后测试看
解决方案:
请注意公共变量放置的位置问题publicpartialclassDefault2:System.Web.UI.Page{stringnr="";protectedvoidPage_Load(objectsender,EventArgse){
解决方案:
学习
解决方案:
想问下15楼。你最后的链接地址还是没换这么办