日期:2014-05-19  浏览次数:20461 次

正则问题,重大疑惑!

www.xaonline.com

提取这个网站首页HTML代码。替换所有相对连接为绝对连接。以便在本机正确显示。

例如:

把  
<a   href= "news/123.html "> 新闻 </a>
替换成
<a   href= "http://www.xaonline.com/news/123.html ">


下面正则替换成功!

Uri   uri   =   new   Uri( "http://www.xaonline.com ");
MatchCollection   mc;
mc   =   Regex.Matches(str,@ " <(\w+)([^> ]+)href\s*=\s*[\ " "]([^\ " "]+)[\ " "]([^> ]*)> ",RegexOptions.IgnoreCase);
for(int   i=0;i <mc.Count;i++)
{
        str     =   str.Replace(mc[i].Groups[3].Value,new   Uri(uri,mc[i].Groups[3].Value).ToString());
}


虽然替换成功,但是有个问题,为什么有些HTML标记中的类似   color、bgcolor   属性都被改了呢     ??


字体颜色也被改了,如下错误;
<font   color= "#ffcc00 ">   被改成了   <font   color= "http://www.xaonline.com/#ffcc00 ">

单元格颜色也被改了。如下错误
<td   height= "17 "   align= "center "   bgcolor= "http://www.xaonline.com/#ffffff ">


有些样式中的color   也被改了   如下错误
.style1   {color:   http://www.xaonline.com/#FF0000}


最后采集到的整个网页都成了兰色背景了   晕啊!到底怎么回事情了??正则中我也没有匹配颜色啊!



------解决方案--------------------
string yourStr = ......;
string resultStr = Regex.Replace(yourStr, "( <.+?=\ ")(.*/.*\ ".+?> ) ", "$1http://www.xaonline.com/$2 ", RegexOptions.IgnoreCase);
你的问题在于替换了所有双引号之间的东西,但是双引号之间的不一定是链接,还可能是属性值(其实链接也是属性值),所以,要替换所有“看起来像”链接的字符串,因此,我替换了所有包含 "/ "的字符串。