/// <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;
}
|