search

Home  >  Q&A  >  body text

正则表达式 - PHP中,如何用正则提取指定的html容器

<p class="baby">
    <img src="" />
    <p class="another-shit">
        <h1>contont</h1>
        <p>ppppppp</p>
    </p>
    <a href="#">my link</a>
    <p class="lie"></p>
</p>
<p class="baby">
    <p class="another-shit">
        <h1>contont</h1>
        <p>ppppppp</p>
    </p>
    <a href="#">my link</a>
    <p class="lie"></p>
</p>
<p class="baby">
    <p class="another-shit">
        <h1>contont</h1>
        <p>ppppppp</p>
    </p>
    <a href="#">my link</a>
    <p class="lie"></p>
</p>
<p class="nonono"></p>

以上代码,我需要提取所有class为baby的容器内容,结构不一定是这样。也就是说,我需要提取某个容器的内容。 谢谢。

大家讲道理大家讲道理2901 days ago658

reply all(3)I'll reply

  • 怪我咯

    怪我咯2017-04-10 14:29:36

    也不知道为什么大家都想用正则来提取 DOM 树 ... 正则分明就不是用来做这个的 ...

    在想要这么做的时候 ... 你看到正则满心的委屈了么 ..?

    让千里马拉磨终归是不好 ... 如果要提取 DOM 树 ... 正确的方式如下 ...

    <?php
    /* in this situation you need DOM ... */
    $doc = new DOMDocument();
    
    /* load your html here ... */
    $doc->loadHTML( <<<HTML_SECTION
    <p class="baby">
        <img src="" />
        <p class="another-shit">
            <h1>contont</h1>
            <p>ppppppp</p>
        </p>
        <a href="#">my link</a>
        <p class="lie"></p>
    </p>
    <p class="baby">
        <p class="another-shit">
            <h1>contont</h1>
            <p>ppppppp</p>
        </p>
        <a href="#">my link</a>
        <p class="lie"></p>
    </p>
    <p class="baby">
        <p class="another-shit">
            <h1>contont</h1>
            <p>ppppppp</p>
        </p>
        <a href="#">my link</a>
        <p class="lie"></p>
    </p>
    <p class="nonono"></p>
    HTML_SECTION
    );
    
    /* make a result array ... */
    $result = [];
    
    /* go through all nodes which have class="baby" ... */
    foreach( ( new DOMXPath( $doc ) )->query( '//*[@class="baby"]' ) 
        as $element )
    
        /* just push it into the result ... */
        $result[] = $doc->saveHTML( $element );
    
    /* and print the result out ... */
    print_r( $result );
    

    关于 DOM 模块 的其他我在之前的 这个答案 里都写的很清楚 ... 这里就不再赘述了 ...

    如果你有兴趣的话可以看看 ...

    至于标题的问题 ... 对于 90% 以上的情况 ... 答案都是 使用正则做不到 ...

    如果你特别坚持非要用正则不可 ... 并且你要处理的文档和你例子中的一样 ... 那有方法如下 ...

    <?php
    /* crying regex matcher ... */
    preg_match_all( 
    '(^(\s*)<(\w+)\sclass="baby">.*^\\1</\\2>)ism',
    <<<HTML_SECTION
    <p class="baby">
        <img src="" />
        <p class="another-shit">
            <h1>contont</h1>
            <p>ppppppp</p>
        </p>
        <a href="#">my link</a>
        <p class="lie"></p>
    </p>
    <p class="baby">
        <p class="another-shit">
            <h1>contont</h1>
            <p>ppppppp</p>
        </p>
        <a href="#">my link</a>
        <p class="lie"></p>
    </p>
    <p class="baby">
        <p class="another-shit">
            <h1>contont</h1>
            <p>ppppppp</p>
        </p>
        <a href="#">my link</a>
        <p class="lie"></p>
    </p>
    <p class="nonono"></p>
    HTML_SECTION
    , $result_tmp );
    
    /* only the first element we need ... */
    print_r( array_shift( $result_tmp ) );
    

    这种方法仅限使用在良好格式化的 html 文档上 ... 由缩进来判断标签的对应关系 ...

    如果是一个比较混乱的 html 文档 ... 那么正则对于提取 DOM 这件事来说无能为力 ...

    恩恩 ... 就是这样啦 ...

    reply
    0
  • 迷茫

    迷茫2017-04-10 14:29:36

    尝试一下phpQuery吧,https://code.google.com/p/phpquery/
    介绍可以看看http://www.cnblogs.com/in-loading/archive/2012/04/11/2442697.html

    reply
    0
  • 阿神

    阿神2017-04-10 14:29:36

    $preg = '/\<p class\=\"baby\"\>(.*?)\<\/p\>/s';
    preg_match_all($preg, $html, $match);
    

    不知道这样可以么~

    reply
    0
  • Cancelreply