asp.net为关键词加上超链接,C#.net 为关键词加上超链接

ningxi_ 2010-12-28 01:25:02
asp.net为关键词加上超链接,C#.net 为关键词加上超链接


想用asp.net为关键词加上超链接,C#.net为关键词加上超链接,功能要求:
1、为html文本里的自定义关键词加上超链接
2、关键词出面在html标签属性值,则不加超链接
3、在a或pre开始标签与结束标签内的的不加超链接
4、可以为关键词加上超链接的地方都加上超链接
5、文章里的关键词全都加上同个超链接,不符合搜索引擎优化,所以可以自定义替换次数就最好。

自己写了一个用asp.net为关键词加上超链接,C#.net为关键词加上超链接的方法,大家看看有什么地方可以改进的,想加快速度。有些条件可以没有考虑到,也希望指出。


/// <summary>
/// 为关键词加上超链接
/// </summary>
/// e.g.:
/// string result=GetInnertLink("<a href="http//www.baidu.com" mce_href="http/www.baidu.com">Ningxi</a>Xi过得<span>XI<span>好<a href="http://www.ningxi.com" mce_href="http://www.ningxi.com">快乐</a>!","xi","ningxi","http://www.ningxi.com","_blank",0)
/// <param name="htmlcode">要把关键词加上超链接的html源文本</param>
/// <param name="keyword">将要加上超链接的关键词</param>
/// <param name="title">将要加上的超链接的描文本</param>
/// <param name="url">将要加上的超链接的url地址</param>
/// <param name="target">将要加上的超链接的打开方式</param>
/// <param name="num">为html文本内的前num个关键词加上超链接,0代表全加上超链接</param>
/// <returns>返回为关键词加上超链接后的html文本</returns>
private static string GetInnertLink(string htmlcode, string keyword, string title, string url, string target, int num)
{
string htmlcodeResult = htmlcode; //用于保存最新的html文本
string htmlcodeLower = htmlcodeResult.ToLower(); //用于保存最新的Hmtl文本的小写,方便不分大小写找出关键词
string keywordResult = ""; //用于保存关键词的原来面貌,可能是大写,或者有大也有小
int keyIndex = 0; //关键词所在位置
int currentIndex = 0; //每次搜索关键词的开始位置
int currentNum = 0; //保存当前加上了多少个有效超链接
int LBracketIndex = 0; //左尖括号<位置
int RBracketIndex = 0; //右尖括号>位置
if (num == 0)
{
num = htmlcode.Length;
}
while (currentIndex <= htmlcodeLower.Length && currentNum < num)
{
if (htmlcodeLower.IndexOf(keyword.ToLower(), currentIndex) > -1)
{
keyIndex = htmlcodeLower.IndexOf(keyword.ToLower(), currentIndex);
LBracketIndex = keyIndex;
do
{
LBracketIndex = htmlcodeLower.LastIndexOf("<", LBracketIndex - 1, LBracketIndex - currentIndex);
}
while (LBracketIndex != -1 && htmlcodeLower.Substring(LBracketIndex + 1, 1) == "/");
RBracketIndex = htmlcodeLower.LastIndexOf(">", keyIndex - 1, keyIndex - currentIndex);
if (LBracketIndex <= RBracketIndex)
{
//不在标签的属性内,可以有在标签开始与结束标志内,或在开始与结束标志外
LBracketIndex = htmlcodeLower.LastIndexOf("<", keyIndex - 1, keyIndex - currentIndex);
if (LBracketIndex != -1 && htmlcodeLower.Substring(LBracketIndex + 1, 1) != "/")
{
//在开始与结束标志内
//关键词在开始标签与结束标签内,要再判定是不是a标签或pre标签
if (htmlcodeLower.Substring(LBracketIndex + 1, 1) == "a" || htmlcodeLower.Substring(LBracketIndex + 3, 3) == "pre")
{
//关键词在开始与结束a标签或pre标签内,不可加超链接,循环再来
currentIndex = keyIndex + keyword.Length;
}
else
{
//可以加超链接
keywordResult = htmlcodeResult.Substring(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Remove(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Insert(keyIndex, "<a href=" + url + " mce_href=" + url + " title=" + title + " target=" + target + ">" + keywordResult + "</a>");
htmlcodeLower = htmlcodeResult.ToLower();
currentIndex = htmlcodeResult.IndexOf("</a>", keyIndex) + 4;
currentNum += 1;
}
}
else
{
//在结束标志外,可以加超链接
keywordResult = htmlcodeResult.Substring(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Remove(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Insert(keyIndex, "<a href=" + url + " mce_href=" + url + " title=" + title + " target=" + target + ">" + keywordResult + "</a>");
htmlcodeLower = htmlcodeResult.ToLower();
currentIndex = htmlcodeResult.IndexOf("</a>", keyIndex) + 4;
currentNum += 1;
}
}
else
{
//关键词是标签内的属性值,不可加超链接,循环再来
currentIndex = keyIndex + keyword.Length;
}
}
else
{
currentIndex = htmlcodeLower.Length + 1;
}
}
return htmlcodeResult;
}



...全文
498 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
kedee 2012-08-20
  • 打赏
  • 举报
回复
这个如果我有1000个关键词怎么调用呢,循环调用,这效率...
钱币老顽童 2011-11-05
  • 打赏
  • 举报
回复
雪石 2011-11-05
  • 打赏
  • 举报
回复
要把关键词加上超链接的html源文本 拆成几段 开个线程一起执行 会快吧 0.0
钱币老顽童 2011-11-05
  • 打赏
  • 举报
回复
(⊙v⊙)嗯楼上的测试通过╮(╯_╰)╭
SomethingJack 2011-09-30
  • 打赏
  • 举报
回复
呵呵 围观学习
wuleixiaoyao 2011-09-30
  • 打赏
  • 举报
回复
老是一激动就弄错了,这个全了。上一个少了else的一个东西

/// <summary>
/// 为关键词加上超链接
/// </summary>
/// e.g.:
/// string result=GetInnertLink("<a href="http//www.baidu.com" mce_href="http/www.baidu.com">Ningxi</a>Xi过得<span>XI<span>好<a href="http://www.ningxi.com" mce_href="http://www.ningxi.com">快乐</a>!","xi","ningxi","http://www.ningxi.com","_blank",0)
/// <param name="htmlcode">要把关键词加上超链接的html源文本</param>
/// <param name="keyword">将要加上超链接的关键词</param>
/// <param name="title">将要加上的超链接的描文本</param>
/// <param name="url">将要加上的超链接的url地址</param>
/// <param name="target">将要加上的超链接的打开方式</param>
/// <param name="num">为html文本内的前num个关键词加上超链接,0代表全加上超链接</param>
/// <returns>返回为关键词加上超链接后的html文本</returns>
public static string GetInnertLink(string htmlcode, string keyword, string title, string url, string target, int num)
{
string htmlcodeResult = htmlcode; //用于保存最新的html文本
string htmlcodeLower = htmlcodeResult.ToLower(); //用于保存最新的Hmtl文本的小写,方便不分大小写找出关键词
string keywordResult = ""; //用于保存关键词的原来面貌,可能是大写,或者有大也有小
int keyIndex = 0; //关键词所在位置
int currentIndex = 0; //每次搜索关键词的开始位置
int currentNum = 0; //保存当前加上了多少个有效超链接
int LBracketIndex = 0; //左尖括号<位置
int RBracketIndex = 0; //右尖括号>位置
if (num == 0)
{
num = htmlcode.Length;
}
while (currentIndex <= htmlcodeLower.Length && currentNum < num)
{
if (htmlcodeLower.IndexOf(keyword.ToLower(), currentIndex) > -1)
{
keyIndex = htmlcodeLower.IndexOf(keyword.ToLower(), currentIndex);
LBracketIndex = keyIndex;
do
{
LBracketIndex = htmlcodeLower.LastIndexOf("<", LBracketIndex - 1, LBracketIndex - currentIndex);
}
while (LBracketIndex != -1 && htmlcodeLower.Substring(LBracketIndex + 1, 1) == "/");
RBracketIndex = htmlcodeLower.LastIndexOf(">", keyIndex - 1, keyIndex - currentIndex);
if (LBracketIndex <= RBracketIndex)
{
//不在标签的属性内,可以有在标签开始与结束标志内,或在开始与结束标志外
LBracketIndex = htmlcodeLower.LastIndexOf("<", keyIndex - 1, keyIndex - currentIndex);
if (LBracketIndex != -1 && htmlcodeLower.Substring(LBracketIndex + 1, 1) != "/")
{
//在开始与结束标志内
//关键词在开始标签与结束标签内,要再判定是不是a标签或pre标签
if (htmlcodeLower.Substring(LBracketIndex + 1, 1) == "a" || htmlcodeLower.Substring(LBracketIndex + 3, 3) == "pre")
{
//关键词在开始与结束a标签或pre标签内,不可加超链接,循环再来
currentIndex = keyIndex + keyword.Length;
}
else
{
//可以加超链接
keywordResult = htmlcodeResult.Substring(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Remove(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Insert(keyIndex, "<a href='" + url + "' title='" + title + "' target='" + target + "'>" + keywordResult + "</a>");
htmlcodeLower = htmlcodeResult.ToLower();
currentIndex = htmlcodeResult.IndexOf("</a>", keyIndex) + 4;
currentNum += 1;
}
}
else if ((RBracketIndex = htmlcodeLower.LastIndexOf(">", keyIndex - 1, keyIndex - currentIndex)) != -1)
{
//
// 当查找范围内存在'>'标签则说明在一个静态控件中则需要判断这个控件是否是a标签
//
if (htmlcodeLower.Substring(htmlcodeLower.IndexOf('<', currentIndex) + 1, 2) == "/a")
{
//关键词在a标签内则不能添加超链接
currentIndex = keyIndex + keyword.Length;
}
else
{
//可以加超链接
keywordResult = htmlcodeResult.Substring(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Remove(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Insert(keyIndex, "<a href='" + url + "' title='" + title + "' target='" + target + "'>" + keywordResult + "</a>");
htmlcodeLower = htmlcodeResult.ToLower();
currentIndex = htmlcodeResult.IndexOf("</a>", keyIndex) + 4;
currentNum += 1;
}
}
else
{
//在结束标志外,可以加超链接
keywordResult = htmlcodeResult.Substring(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Remove(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Insert(keyIndex, "<a href='" + url + "' title='" + title + "' target='" + target + "'>" + keywordResult + "</a>");
htmlcodeLower = htmlcodeResult.ToLower();
currentIndex = htmlcodeResult.IndexOf("</a>", keyIndex) + 4;
currentNum += 1;
}
}
else
{
//关键词是标签内的属性值,不可加超链接,循环再来
currentIndex = keyIndex + keyword.Length;
}
}
else
{
currentIndex = htmlcodeLower.Length + 1;
}
}
return htmlcodeResult;
}
wuleixiaoyao 2011-09-30
  • 打赏
  • 举报
回复
……少东西了。这个才是

//在结束标志外,可以加超链接
keywordResult = htmlcodeResult.Substring(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Remove(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Insert(keyIndex, "<a href='" + url + "' title='" + title + "' target='" + target + "'>" + keywordResult + "</a>");
htmlcodeLower = htmlcodeResult.ToLower();
currentIndex = htmlcodeResult.IndexOf("</a>", keyIndex) + 4;
currentNum += 1;
wuleixiaoyao 2011-09-30
  • 打赏
  • 举报
回复
这个如果你的a标签中title是关键字就没办法判断了就一直循环的a标签中的关键字加连接我看了半天发现在加个判断就一个解决这个方法

/// <summary>
/// 为关键词加上超链接
/// </summary>
/// e.g.:
/// string result=GetInnertLink("<a href="http//www.baidu.com" mce_href="http/www.baidu.com">Ningxi</a>Xi过得<span>XI<span>好<a href="http://www.ningxi.com" mce_href="http://www.ningxi.com">快乐</a>!","xi","ningxi","http://www.ningxi.com","_blank",0)
/// <param name="htmlcode">要把关键词加上超链接的html源文本</param>
/// <param name="keyword">将要加上超链接的关键词</param>
/// <param name="title">将要加上的超链接的描文本</param>
/// <param name="url">将要加上的超链接的url地址</param>
/// <param name="target">将要加上的超链接的打开方式</param>
/// <param name="num">为html文本内的前num个关键词加上超链接,0代表全加上超链接</param>
/// <returns>返回为关键词加上超链接后的html文本</returns>
public static string GetInnertLink(string htmlcode, string keyword, string title, string url, string target, int num)
{
string htmlcodeResult = htmlcode; //用于保存最新的html文本
string htmlcodeLower = htmlcodeResult.ToLower(); //用于保存最新的Hmtl文本的小写,方便不分大小写找出关键词
string keywordResult = ""; //用于保存关键词的原来面貌,可能是大写,或者有大也有小
int keyIndex = 0; //关键词所在位置
int currentIndex = 0; //每次搜索关键词的开始位置
int currentNum = 0; //保存当前加上了多少个有效超链接
int LBracketIndex = 0; //左尖括号<位置
int RBracketIndex = 0; //右尖括号>位置
if (num == 0)
{
num = htmlcode.Length;
}
while (currentIndex <= htmlcodeLower.Length && currentNum < num)
{
if (htmlcodeLower.IndexOf(keyword.ToLower(), currentIndex) > -1)
{
keyIndex = htmlcodeLower.IndexOf(keyword.ToLower(), currentIndex);
LBracketIndex = keyIndex;
do
{
LBracketIndex = htmlcodeLower.LastIndexOf("<", LBracketIndex - 1, LBracketIndex - currentIndex);
}
while (LBracketIndex != -1 && htmlcodeLower.Substring(LBracketIndex + 1, 1) == "/");
RBracketIndex = htmlcodeLower.LastIndexOf(">", keyIndex - 1, keyIndex - currentIndex);
if (LBracketIndex <= RBracketIndex)
{
//不在标签的属性内,可以有在标签开始与结束标志内,或在开始与结束标志外
LBracketIndex = htmlcodeLower.LastIndexOf("<", keyIndex - 1, keyIndex - currentIndex);
if (LBracketIndex != -1 && htmlcodeLower.Substring(LBracketIndex + 1, 1) != "/")
{
//在开始与结束标志内
//关键词在开始标签与结束标签内,要再判定是不是a标签或pre标签
if (htmlcodeLower.Substring(LBracketIndex + 1, 1) == "a" || htmlcodeLower.Substring(LBracketIndex + 3, 3) == "pre")
{
//关键词在开始与结束a标签或pre标签内,不可加超链接,循环再来
currentIndex = keyIndex + keyword.Length;
}
else
{
//可以加超链接
keywordResult = htmlcodeResult.Substring(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Remove(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Insert(keyIndex, "<a href='" + url + "' title='" + title + "' target='" + target + "'>" + keywordResult + "</a>");
htmlcodeLower = htmlcodeResult.ToLower();
currentIndex = htmlcodeResult.IndexOf("</a>", keyIndex) + 4;
currentNum += 1;
}
}
else if ((RBracketIndex = htmlcodeLower.LastIndexOf(">", keyIndex - 1, keyIndex - currentIndex)) != -1)
{
//
// 当查找范围内存在'>'标签则说明在一个静态控件中则需要判断这个控件是否是a标签
//
if (htmlcodeLower.Substring(htmlcodeLower.IndexOf('<', currentIndex) + 1, 2) == "/a")
{
//关键词在a标签内则不能添加超链接
currentIndex = keyIndex + keyword.Length;
}
}
else
{
//在结束标志外,可以加超链接
keywordResult = htmlcodeResult.Substring(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Remove(keyIndex, keyword.Length);
htmlcodeResult = htmlcodeResult.Insert(keyIndex, "<a href='" + url + "' title='" + title + "' target='" + target + "'>" + keywordResult + "</a>");
htmlcodeLower = htmlcodeResult.ToLower();
currentIndex = htmlcodeResult.IndexOf("</a>", keyIndex) + 4;
currentNum += 1;
}
}
else
{
//关键词是标签内的属性值,不可加超链接,循环再来
currentIndex = keyIndex + keyword.Length;
}
}
else
{
currentIndex = htmlcodeLower.Length + 1;
}
}
return htmlcodeResult;
}


这个是我想到的办法测试了下基本是可以的。
MSDNXGH 2011-08-01
  • 打赏
  • 举报
回复
有空看
huting0917 2011-08-01
  • 打赏
  • 举报
回复
我用过这个方法,能对关键字加链接,但还是有问题,如果内容里面a标签有关键字则不加链接,这里不能实现,忘高手指点如何改正。
ningxi_ 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 net5354 的回复:]
有时间测试测试,多谢了
[/Quote]

你的话真给力!!
有问题,有改进,记得找找小弟我哦。
net5354 2010-12-30
  • 打赏
  • 举报
回复
有时间测试测试,多谢了
ningxi_ 2010-12-30
  • 打赏
  • 举报
回复
自己顶一下,突然想到,如果把htmlcode先根据关键词做拆分(split),再对每一小段的关键词做以上的加超链接
ningxi_ 2010-12-29
  • 打赏
  • 举报
回复
有没有更好的方法呢?
xuan.ye 2010-12-28
  • 打赏
  • 举报
回复
好多代码啊
ycproc 2010-12-28
  • 打赏
  • 举报
回复
tag mark

62,046

社区成员

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

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

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

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