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

问题描述

现在网站经常要给文章里的关键字自动加链接。。所在这里就涉及到给指定关键字加链接,替换字符串问题如我的文章为: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楼。你最后的链接地址还是没换这么办

时间: 2025-01-01 18:08:13

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

搜索关键字加粗函数代码

关键字|函数|加粗 一个用正则表达式突出显示字符串中查询到的单词的函数,精简实用! Public Function BoldWord(strContent,word) If word="" Then BoldWord = strContent Exit Function End IF dim objRegExp Set objRegExp=new RegExp objRegExp.IgnoreCase =true objRegExp.Global=True objRegExp.Patt

站长养博客到底该不该加链接

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 相信广大站长跟我一样,为了增加外链,都养着一些博客吧,少则10几个,多则几十个,但大家好像对养的博客到底加不加链接各抒己见,看法不一,下面我根据我自己的实际情况和大家谈谈. 第一种,是加链接的.这种看法的人觉得,你既然花那么多时间养了博客不就是为了那一链吗?不在每篇文章后面加链接,你还养博客做什么?还不如去多做些链接,多去发些帖子呢.就那我的

php给文章加关键字连接,163文章内容自动加链接效果

php给文章加关键字连接,像163文章内容自动加链接效果 <?php  $keys =array(      array('网页特效','/js_a/js.html'),      array('seo','/seo/seo.html'),      array('php','/phper/php.html'),      array('jsp','/jsp/jsp.html'),      array('asp','/asp/asp.html'),       array('ps','/fw/

帝国cms后台发文章时关键词加链接方法

帝国cms后台发文章时关键词加链接方法 方法一:系统设置:后台>其他管理>管理内容关键字 方法二:手工加你选择文字然后再点那个插入链接

帝国cms内容关键字自动加链接且设置内容关键字只替换一次

网站上线前先设置一些内部链接对后期的优化排名很有帮助,帝国cms也可以设置文章中的关键字自动加链接,但是要注意一下关键词替换次数,最好是1次. 怎么操作呢?分两步完成 1.帝国cms文章关键字自动加链接:后台 - 其他 - 管理内容关键字 - 在框中添加关键词和链接 2.设置关键词只显示一次(关键词链接只替换一次) 后台 - 系统 - 系统 - 系统设置 - 系统参数设置 - 信息设置 找到"信息内容关键字重复替换",把默认的"0"改成"1" 帝

python学习-求用Python写个小函数:让用户在界面输入一个数字,然后返回输出这个数字加1的结果

问题描述 求用Python写个小函数:让用户在界面输入一个数字,然后返回输出这个数字加1的结果 求用Python写个函数:让用户在界面输入一个数字,然后返回输出这个数字加1的结果,小白刚学Python,求指点,谢谢! 解决方案 不好意思: return x+1 不需要,只能在函数内使用 可以像下面这么写: x = int(input("x = ")) print("Output is:",x+1) 解决方案二: 写一个函数输入4个数字然后输出每个字符之间加一个空格

SQLSERVER中的ALL、PERCENT、CUBE关键字、ROLLUP关键字和GROUPING函数

原文:SQLSERVER中的ALL.PERCENT.CUBE关键字.ROLLUP关键字和GROUPING函数 SQLSERVER中的ALL.PERCENT.CUBE关键字.ROLLUP关键字和GROUPING函数  先来创建一个测试表 1 USE [tempdb] 2 GO 3 4 CREATE TABLE #temptb(id INT ,NAME VARCHAR(200)) 5 GO 6 7 INSERT INTO [#temptb] ( [id], [NAME] ) 8 SELECT 1,'

jsp中全文给关键词加链接

问题描述 文章中对某些词加链接,例如对"百度"关键词:<p align="center"><img border="0" src="/UserFiles/Image/20120419082538_802.jpg" alt="">你好,欢迎加入百度!</p>我在jsp后台对该内容字段直接replace替换:<p align="center">

帝国cms关键字加超链接,帝国cms新闻内容关键字加超链接的方法

帝国cms关键字加超链接,帝国cms新闻内容关键字加超链接的方法:文章已经有了关键字,就是要在这些关键字上加上搜索这个关键字的链接.不是后台手动给它加上指定链接那种.也不是标签TAG. 代码如下: <?php $arrkey=$navinfor['keyboard'] ? explode(',',$navinfor['keyboard']) : ''; if($arrkey){ foreach($arrkey as $var){ echo '<a href='.$public_r['newsu