一个HTML文档中,有很多个 <h1></h1>标签,并且某个H1之后有一个<div class="content">标签
我现在想要实现的是,匹配离 <div class="content"> 最近的这个标签比如 
<h1>a</h1>
<h1>b</h1>
<h1>c</h1>
<h1>d</h1>
<div class="content">asdfasdfasdf</div>我现在想匹配 d ,但是试了几个正则都不行
我现在是这么写的
preg_match("/<h1[^>]*>(.*?)<\/h1>[^((?!<h).)*]content/is",$data,$arr);
但是什么都匹配不出来,是哪里出了问题呢,应该怎么写

解决方案 »

  1.   

    try$html = <<<html
    <h1>a</h1>
    <h1>b</h1>
    <h1>c</h1>
    <h1>d</h1>
    <div class="content">asdfasdfasdf</div>
    html;preg_match("/<h1[^>]*>([^<>]*)<\/h1>(?=\s*<div[^>]*class=\"content\")/is",$html,$match);echo $match[1];
      

  2.   

    改动下preg_match("/<h1[^>]*>([^<]*)<\/h1>\s*<(?!h)/is",$h,$arr);//不用断言,也可以preg_match("#<h1[^>]*>([^<]*)</h1>\s*<div[^>]*?class\s*=\s*[\"']?content[\"']?#is", $h, $arr);
      

  3.   

    这样不行啊,主要是中间还有别的代码
    比如 
    <h1>c</h1>
    <h1>d</h1>
    asdfdd
    asdf
    asdf
    <div class="content">asdfasdfasdf</div>
      

  4.   

    你把例子的贴出来正则不太可能“万事通”的如果只是asdfasdf字符,只要改一下\s*即可。
      

  5.   

    问正则就应该把所有可能的情况贴出来,要不你要问到猴年马月,相信你把所有可能的情况理清楚,相应的正则式也差不多了。除了上面可能出现的情况,还有呢,也就是说最后一个<h1>和<div class="content"之间有可能出现其它html标签?$html = <<<html
    <h1>a</h1>
    <h1>b</h1>
    <h1>c</h1>
    <h1>d</h1>
    <a>asdf</a>
    ssdf
    sdfsdf
    sdfsdf
    <div class="content">asdfasdfasdf</div>
    html;preg_match("/<h1[^>]*>([^<>]*)<\/h1>(?:(?!<h1[^>]*>[^<>]*<\/h1>).)*(?=\s*<div[^>]*class=\"content\")/is",$html,$match);echo $match[1];