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

正则表达式问题 html取值
HTML code

<div class="fans_top" id="weibo_head">
<a href="http://baidu.com/" target="_blank">评论(0)</a>
<div>dddd</div>
</div>

<div class="ddd" id="ccc">
<a href="http://baidu.com/" target="_blank">评论(20)</a>
<a href="http://baidu.com/" target="_blank">评论(150)</a>
</div>




想得到的结果为:class为fans_top 和id为weibo_head里面包含的html值;
正则的写法为:(?<=<div[^>]+class="fans_top"[^>]+id="weibo_head"[^>]*>)[\s\S]*?(?=</div>)

但是在此DIv中不包含子div时,值是取的正确的,现在就是里面如果在出现一个div的话,结束的地方就产生了错误!




------解决方案--------------------

C# code


                string htmsStr = @"<div class=""fans_top"" id=""weibo_head"">
<a href=""http://baidu.com/"" target=""_blank"">评论(0)</a>
<div>dddd</div>
</div>

<div class=""ddd"" id=""ccc"">
<a href=""http://baidu.com/"" target=""_blank"">评论(20)</a>
<a href=""http://baidu.com/"" target=""_blank"">评论(150)</a>
</div>
";               
                Regex re = new Regex("(?is)(?<=<div\\s*class=\"fans_top\"\\s*id=\"weibo_head\">).*?(?=</div>)", RegexOptions.None);
                Match mt = re.Match(htmsStr);                 
                Console.WriteLine(mt.Value);
                Console.ReadLine();

------解决方案--------------------
C# code
string tempStr = File.ReadAllText(@"C:\Documents and Settings\Administrator\桌面\Test.txt", Encoding.GetEncoding("GB2312"));
                string pattern = @"(?i)(?<=<div[^>]*?class=['""]?fans_top['""]?[^>]*?id=['""]?weibo_head['""]?[^>]*?>)(?><div[^>]*>(?<Open>)|</div>(?<-Open>)|(?:(?!</?div\b)[\s\S])*)*(?=</div>)";
                string temp_result = Regex.Match(tempStr,pattern).Value;
                //<a href=\"http://baidu.com/\" target=\"_blank\">评论(0)</a>\r\n<div>dddd</div>