HTML嵌套匹配正则

winder 2011-04-06 10:11:49
比如:
<div style="background-color:gray;" id="footer">
<a id="gotop" href="#" onclick="MGJS.goTop();return false;">Top</a>
<a id="powered" href="http://wordpress.org/">WordPress</a>
<div id="copyright">
Copyright © 2009 简单生活 —— Kevin Yang的博客
</div>
<div id="themeinfo">
Theme by <a href="http://www.neoease.com/">mg12</a>. Valid <a href="http://validator.w3.org/check?uri=referer">XHTML 1.1</a>
and <a href="http://jigsaw.w3.org/css-validator/">CSS 3</a>.
</div>
</div>

能查找到id="footer"这个完整的div
...全文
234 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
winder 2011-04-07
  • 打赏
  • 举报
回复
谢谢,可以了。
我括号的位置不对。

lazyboy_wu 2011-04-07
  • 打赏
  • 举报
回复
不明白你是怎么测试的


<?php

$html = <<<STR

<div style="background-color:gray;" id="footer">
<a id="gotop" href="#" onclick="MGJS.goTop();return false;">Top</a>
<a id="powered" href="http://wordpress.org/">WordPress</a>
<div id="copyright">
Copyright © 2009 简单生活 —— Kevin Yang的博客
</div>
<div id="themeinfo">
Theme by <a href="http://www.neoease.com/">mg12</a>. Valid <a href="http://validator.w3.org/check?uri=referer">XHTML 1.1</a>
and <a href="http://jigsaw.w3.org/css-validator/">CSS 3</a>.
</div>
</div>

STR;

$reg = "/<(\/?)(\w+)(([^>]*?)id=['\"](\w+)['\"])*([^>]*?)>/im";

preg_match($reg, $html, $matches);

var_dump($matches);





// 显示结果

array(7) {
[0]=>
string(48) "<div style="background-color:gray;" id="footer">"
[1]=>
string(0) ""
[2]=>
string(3) "div"
[3]=>
string(43) " style="background-color:gray;" id="footer""
[4]=>
string(32) " style="background-color:gray;" "
[5]=>
string(6) "footer"
[6]=>
string(0) ""
}
winder 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hnxxwyq 的回复:]
/<(\/?)(\w+)(([^>]*?)id=['\"](\w+)['\"])*([^>]*?)>/

改成这样,将([^>]*?)(id=['\"](\w+)['\"]) 和并为一组
[/Quote]

还是不行,还是会被做后的([^>]*?)捕获。
zhang6464 2011-04-07
  • 打赏
  • 举报
回复
这个问题用正则是不好解决的,在有嵌套的情况下结束条件会冲突,建议你用dom吧,把格式补全了,用dom解析下,直接getElementById就ok了
lazyboy_wu 2011-04-07
  • 打赏
  • 举报
回复

/<(\/?)(\w+)(([^>]*?)id=['\"](\w+)['\"])*([^>]*?)>/

改成这样,将([^>]*?)(id=['\"](\w+)['\"]) 和并为一组
winder 2011-04-07
  • 打赏
  • 举报
回复
不能用+

目的就是属性可有可无。
ImN1 2011-04-06
  • 打赏
  • 举报
回复
需要libxml,对操作系统没要求,
如果你用的是虚拟空间,基本都有安装的,用phpinfo查看一下有没有dom就行
winder 2011-04-06
  • 打赏
  • 举报
回复
DOM对系统有要求吗?
比如:操作系统、是否需要额外安装其它插件?

lazyboy_wu 2011-04-06
  • 打赏
  • 举报
回复
用dom多好啊!

php手册上的dom
winder 2011-04-06
  • 打赏
  • 举报
回复
还有种.Net的:
C# code string str = "<div style=\"background-color:gray;\" id=\"footer\">"
+ "<a id=\"gotop\" href=\"#\" onclick=\"MGJS.goTop();return false;\">Top</a>"
+ "<a id=\"powered\" href=\"http://wordpress.org/\">WordPress</a>"
+ "<div id=\"copyright\">"
+ "Copyright © 2009 简单生活 —— Kevin Yang的博客"
+ "</div>"
+ "<div id=\"themeinfo\">"
+ "Theme by <a href=\"http://www.neoease.com/\">mg12</a>. Valid <a href=\"http://validator.w3.org/check?uri=referer\">XHTML 1.1</a>"
+ "and <a href=\"http://jigsaw.w3.org/css-validator/\">CSS 3</a>"
+ "</div>"
+ "</div><div>zzz</div>";
Regex reg = new Regex(@"(?is)<div[^>]*?id=""footer""[^>]*?>((?!</?div).)*(((?<Open><div[^>]*>)((?!</?div).)*)*((?<-Open></div>)((?!</?div).)*)*)*(?(Open)(?!))");
foreach (Match m in reg.Matches(str))
{
Response.Write(m.Value);
}

winder 2011-04-06
  • 打赏
  • 举报
回复
尝试了很多种,但都不行:
<?
$string ="<div>d<p>p<div>div</div><div>div</div><div id='footer'>d<div>rdiv</div>iv</div><div>div</div>p</p>dd</div>";

$p = "#(<(\w+)[^>]*(?:id=['\"].*?['\"])[^>]*>)((?:(?:[^<]|<(?!\\2))*?|(?R))*)(</\\2>)#ise";
$p = "/(".
"<\!\w+(?:\s+[^>]*?)+\s*>|".
"<\w+(?:\s+\w+(?:\s*=\s*(?:\"[^\"]*\"|'[^']*'|[^\"'>\s]+))?)*\s*\/?>|".
"<\/\w+\s*>|".
"<\!--[^-]*-->".
")/";

$p = "#<(?P<HtmlTag>div)[^>]*\s[iI][dD]=(?P<Quote>[\"']?)footer(?P=Quote)[^>]*>#";


$p = "#(<(\w+)[^>]*id=['\"].*?['\"][^>]*>)((<\\2[^>]*>(?:(?:[^<]|<(?!\\2))*?|(?R))*</\\2>)*)(</\\2>)#ise";
$p = "#(<(\w+)[^>]*(?:id=['\"].*?['\"])[^>]*>)((?:(?:[^<]|<(?!\\2))*?|(?R))*)(</\\2>)|(<(\w+)[^>]*>)((?:(?:[^<]|<(?!\\2))*?|(?R))*)(</\\2>)#ise";

$content = preg_match_all( $p, $string, $arr );

print_r( $arr );

exit;
?>
lazyboy_wu 2011-04-06
  • 打赏
  • 举报
回复
(id=['\"](\w+)['\"])+ 用+ 不用*
winder 2011-04-06
  • 打赏
  • 举报
回复
另外,还奇怪的一个问题:
$re = "/<(\/?)(\w+)([^>]*?)(id=['\"](\w+)['\"])*([^>]*?)>/im"

对于:
<div style="background-color:gray;" id="footer">

没办法匹配id的属性,全跑到最后的([^>]*?)这个捕获组去了。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧