to lijiangchxp2005: 我写的这段是符合xhtml的,但是很多页面都是不符合的,而且我的这个实际页面中会有用户编辑的内容,所以不能假定是符合xml的。所以这个方法行不通啊
to dk385: 都用到栈了,我想应该能行了,回头试试。刚才想了一下,写代码来做的话,实际上也是压制。但考虑类似的html出来还会很多,所以打算用HtmlAgility(一个开源的东西,可以加载html并操作,还是不错的,不知道能否经得住考验,呵呵)。不过先谢了,看来正则还是很强大的,我回头要认证研究一下你的这个表达式。
只要<div>是成对出现的,用正则没什么不可以的,只不过要用到平衡组,能理解的人不多罢了string id = "gw1"; //id可以是变量 Match m = Regex.Match(str, @"(?<=<div.*?id=""" + id + @"""[^>]*>)((?><div[^>]*>(?<o>)|</div>(?<-o>)|((?!</?div)[\s\S]))*)(?(o)(?!))(?=</div>)", RegexOptions.IgnoreCase); if (m.Success) MessageBox.Show(m.Value);
这个是js的代码吧?我现在只能用服务器端的代码处理。
有什么解析html的东西吗?最好是官方的,或者应用比较多的。谢谢
兄弟,不难就给写个吧,多谢啊
<div.+gw1[^>]*>[^<>]*(((?'Subdiv'<div[^>]*>)[^<>]*)+((?'-Subdiv'</div>)[^<>]*)+)*(?(Subdiv)(?!))</div>
这个我没有匹配出来,另外Subdiv这么写是不是对层数有限制啊?
将字符串转换为 XmlDocument ,然后你就可以随意的操作了 ,无论是嵌套还是什么,都可以实现了string s="<div id=\"nihao\"><div>chxp</div> </div> "; string result = ""; System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.LoadXml(s); System.Xml.XmlNodeList nodeList = doc.ChildNodes; foreach(System.Xml.XmlNode node in nodeList)
{
if(node.Attributes["id"].Value == "要匹配的id 的参数")
{
//id 匹配的值,就是你要获取的XMLNode,从 InnerXml 就可以取到你想要的东西
result = node.InnerXml;
}
}
如果你的div里还可能有其它的html标记用这个:
<div.+gw1[^>]*>[^<>]*(((?'Subdiv' <\w+[^>]*>)[^<>]*)+((?'-Subdiv' </\w+>)[^<>]*)+)*(?(Subdiv)(?!))</div>(?'Subdiv' <div[^>]*>)是说遇到形如<div...>这样的则把捕获的内容标记为Subdiv,并压入堆栈
(?'-Subdiv' </div>)则相反,遇到</div>后,把最后压入堆栈Subdiv捕获内容弹出,如堆栈本来为空,则匹配失败。
(?(Subdiv)(?!))表示匹配完成后,如果堆栈还有标记为Subdiv的内容,则匹配失败。也就是<div...>与</div>的标签个数不一致。
前面匹配不到可能这里“[^ <>]”多了空格,改为“[^<>]”就可。
我写的这段是符合xhtml的,但是很多页面都是不符合的,而且我的这个实际页面中会有用户编辑的内容,所以不能假定是符合xml的。所以这个方法行不通啊
都用到栈了,我想应该能行了,回头试试。刚才想了一下,写代码来做的话,实际上也是压制。但考虑类似的html出来还会很多,所以打算用HtmlAgility(一个开源的东西,可以加载html并操作,还是不错的,不知道能否经得住考验,呵呵)。不过先谢了,看来正则还是很强大的,我回头要认证研究一下你的这个表达式。
高手很多.只是个人意件
Match m = Regex.Match(str, @"(?<=<div.*?id=""" + id + @"""[^>]*>)((?><div[^>]*>(?<o>)|</div>(?<-o>)|((?!</?div)[\s\S]))*)(?(o)(?!))(?=</div>)", RegexOptions.IgnoreCase);
if (m.Success)
MessageBox.Show(m.Value);
Match match = Regex.Match(strTest, "(?<=<div\\s+id=\""+id +"\"[^>]*>\\s*)(((?'layer'<div[^>]*>)[^<>]*)+((?'-layer'</div>)[^<>]*)+)*(?(layer)(?!))(?=\\s*</div>)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
测了一下
id="gw1";
match.value=
<div id="newsFeeder" class="groupItem">
<div class="itemHeader">aaaa </div>
<div class="itemContent">bbbb </div>
</div>
<div id="news" class="groupItem">
<div class="itemHeader">cccc </div>
<div class="itemContent">dddd </div>
</div>
(id="gw2";)
match.value=
<div id="shop" class="groupItem">
<div class="itemHeader">
eeee
</div>
<div class="itemContent">
</div>
</div>