Heim >Backend-Entwicklung >PHP-Tutorial >正则表达式 - PHP中,如何用正则提取指定的html容器
<code><div class="baby"> <img src="" alt="正则表达式 - PHP中,如何用正则提取指定的html容器" > <div class="another-shit"> <h1>contont</h1> <p>ppppppp</p> </div> <a href="#">my link</a> <div class="lie"></div> </div> <div class="baby"> <div class="another-shit"> <h1>contont</h1> <p>ppppppp</p> </div> <a href="#">my link</a> <div class="lie"></div> </div> <div class="baby"> <div class="another-shit"> <h1>contont</h1> <p>ppppppp</p> </div> <a href="#">my link</a> <div class="lie"></div> </div> <div class="nonono"></div> </code>
以上代码,我需要提取所有class为baby的容器内容,结构不一定是这样。也就是说,我需要提取某个容器的内容。 谢谢。
<code><div class="baby"> <img src="" alt="正则表达式 - PHP中,如何用正则提取指定的html容器" > <div class="another-shit"> <h1>contont</h1> <p>ppppppp</p> </div> <a href="#">my link</a> <div class="lie"></div> </div> <div class="baby"> <div class="another-shit"> <h1>contont</h1> <p>ppppppp</p> </div> <a href="#">my link</a> <div class="lie"></div> </div> <div class="baby"> <div class="another-shit"> <h1>contont</h1> <p>ppppppp</p> </div> <a href="#">my link</a> <div class="lie"></div> </div> <div class="nonono"></div> </code>
以上代码,我需要提取所有class为baby的容器内容,结构不一定是这样。也就是说,我需要提取某个容器的内容。 谢谢。
也不知道为什么大家都想用正则来提取 DOM 树 ... 正则分明就不是用来做这个的 ...
在想要这么做的时候 ... 你看到正则满心的委屈了么 ..?
让千里马拉磨终归是不好 ... 如果要提取 DOM 树 ... 正确的方式如下 ...
<code><?php /* in this situation you need DOM ... */ $doc = new DOMDocument(); /* load your html here ... */ $doc->loadHTML( <img src="" alt="正则表达式 - PHP中,如何用正则提取指定的html容器" > <div class="another-shit"> <h1>contont</h1> <p>ppppppp</p> </div> <a href="#">my link</a> <div class="lie"></div> <div class="baby"> <div class="another-shit"> <h1>contont</h1> <p>ppppppp</p> </div> <a href="#">my link</a> <div class="lie"></div> </div> <div class="baby"> <div class="another-shit"> <h1>contont</h1> <p>ppppppp</p> </div> <a href="#">my link</a> <div class="lie"></div> </div> <div class="nonono"></div> 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 ); </code>
关于 DOM 模块 的其他我在之前的 这个答案 里都写的很清楚 ... 这里就不再赘述了 ...
如果你有兴趣的话可以看看 ...
至于标题的问题 ... 对于 90% 以上的情况 ... 答案都是 使用正则做不到 ...
如果你特别坚持非要用正则不可 ... 并且你要处理的文档和你例子中的一样 ... 那有方法如下 ...
<code><?php /* crying regex matcher ... */ preg_match_all( '(^(\s*)<(\w+)\sclass="baby">.*^\\1\\2>)ism', <img src="" alt="正则表达式 - PHP中,如何用正则提取指定的html容器" > <div class="another-shit"> <h1>contont</h1> <p>ppppppp</p> </div> <a href="#">my link</a> <div class="lie"></div> <div class="baby"> <div class="another-shit"> <h1>contont</h1> <p>ppppppp</p> </div> <a href="#">my link</a> <div class="lie"></div> </div> <div class="baby"> <div class="another-shit"> <h1>contont</h1> <p>ppppppp</p> </div> <a href="#">my link</a> <div class="lie"></div> </div> <div class="nonono"></div> HTML_SECTION , $result_tmp ); /* only the first element we need ... */ print_r( array_shift( $result_tmp ) ); </code>
这种方法仅限使用在良好格式化的 html 文档上 ... 由缩进来判断标签的对应关系 ...
如果是一个比较混乱的 html 文档 ... 那么正则对于提取 DOM 这件事来说无能为力 ...
恩恩 ... 就是这样啦 ...
尝试一下phpQuery吧,https://code.google.com/p/phpquery/
介绍可以看看http://www.cnblogs.com/in-loading/archive/2012/04/11/2442697.html
<code>$preg = '/\<div class>(.*?)\/s'; preg_match_all($preg, $html, $match); <p>不知道这样可以么~</p> </div></code>