日期:2014-05-18  浏览次数:20388 次

求正则,关键词内链!
/// <summary> 

/// 为关键词加上超链接 

/// </summary> 

/// <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 string test(string htmlcode, string keyword, string title, string url, string target,int num)

{

Regex reg = new Regex(@"(?in)[^<>]+(?=(<(?!/(pre|a))[^<>]*>[^<>]*)*(<(a|pre)\b|$))");

string strReplacement = "<a href=\"" + url + "\" title=\"" + title + "\" target=\"" + target + "\" >" + keyword + "<a>";

return reg.Replace(htmlcode, strReplacement, num);

}




(?in)[^<>]+(?=(<(?!/(pre|a))[^<>]*>[^<>]*)*(<(a|pre)\b|$))


这个是正则表达式


<a title="abc">abc</a>adabc<pre title="abc">
abcde</pre>abcd<div title="abc">abcdefabc</div>


这个是过滤文本

替换后就变成
<a title="abc">abc</a><a href="http://www.baidu.com/" title="关键词">关键词</a><pre title="abc"><a href="http://www.baidu.com/" title="关键词">关键词</a>
abcde</pre><a href="http://www.baidu.com/" title="关键词" >关键词</a><div title="abc"><a href="http://www.baidu.com/" title="关键词" >关键词</a></div>
这个不是我想要的结果。。。
结果应该为
<a title="abc">abc</a>ad<a href="http://www.baidu.com/" title="关键词">关键词</a><pre title="abc"> 
abcde</pre><a href="http://www.baidu.com/" title="关键词" >关键词</a>d<div title="abc"><a href="http://www.baidu.com/" title="关键词" >关键词</a>def<div title="abc"><a href="http://www.baidu.com/" title="关键词" >关键词</a></div>


就是只替换不在标签属性(比如title)和a标签和pre标签里的关键词(这里用abc来替代)



懂的大虾给正则,对的就给分。不要拷贝别人的东西啊,很多都是错的。

------解决方案--------------------
C# code
 string str=@"<a title=""abc"">abc</a>adabc<pre title=""abc"">
abcde</pre>abcd<div title=""abc"">abcdefabc</div>";
            string result = Regex.Replace(str, @"(?<!<(?:a|pre)[^>]*>[^<>]*|title="")abc(?![^<>]*</(?:a|pre)>|"")", @"<a href=""http://www.baidu.com"" title=""天天向上"">天天向上</a>");
            Console.WriteLine(result);
/*
<a title="abc">abc</a>ad<a href="http://www.baidu.com" title="天天向上">天天向上
</a><pre title="abc">
abcde</pre><a href="http://www.baidu.com" title="天天向上">天天向上</a>d<div tit
le="abc"><a href="http://www.baidu.com" title="天天向上">天天向上</a>def<a href=
"http://www.baidu.com" title="天天向上">天天向上</a></div>

*/

--