网页爬虫 - php中在函数preg_match_all()如何使用正则表达式匹配多重嵌套的html结构?
大家讲道理
大家讲道理 2017-04-10 17:38:20
[PHP讨论组]

举例:

...
<h1>我是标题</h1>
<p class='myclass'>
   <p>这是一行文字</p>
   <p>这是一个p</p>
   <p>
       <p>这是嵌套的一行文字</p>
   </p>
</p>
...

如上所示,服务器端返回一段很长的dom结构,需求是把<h1>标签下面最大的那个p拿到,然后解析出其中p标签内的数据,使用preg_match_all()或者preg_match(),正则表达式如何才能匹配到最外层的这个p?

PS:因为页面结构太杂,所以才想到先匹配到h1下面的的p,然后再匹配p中的p

PS:再精简一点,如果p的class是特定的,整个dom结构中只有一个myclass,如果匹配出带有这个class的p

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(2)
ringa_lee

如果不是非常在意性能,这个可以像js/jquery的语法一样获取DOM的内容,比如:

$crawler = new Crawler('<p xxx></p>');
$crawler->filter('body > p')->eq(0);
  • DOMDocument extension=dom.so

  • phpquery 仿jQuery语法 http://code.google.com/p/phpquery/

  • DomCrawler symfony出品 https://symfony.com/doc/current/components/dom_crawler.html

  • querypath http://querypath.org/

  • simplehtmldom http://simplehtmldom.sourceforge.net/

你提到多重嵌套,想必是:<p class="xxx">(.*?)</p>不好使的问题,面对这个问题时,一般这么做

  1. 先找到找到这个<p> 的特征,这个特征可以根据class、或者一些属性可以匹配到,比如:<p[^<>]*class="xxx">

  2. 再找到这个</p> 结尾处的特征,光</p> 肯定是不够的,还要往下找,比如找到下一个<p class="yyy">的特征

  3. 如果特征比较明显: 开始特征 (.*?) 结尾特征 可以捕获中间的内容

天蓬老师

可以用simple_html_dom.php:

<?php
$html = <<<'nowdoc'
<h1>我是标题</h1>
<p class='myclass'>
    <p>这是一行文字</p>
    <p>这是一个p</p>
    <p>
        <p>这是嵌套的一行文字</p>
    </p>
</p>
nowdoc;
require 'simple_html_dom.php';
$html = str_get_html($html);
foreach($html->find('p.myclass') as $v) {
    $arr[] = trim($v->find('p', 0)->plaintext);
    $arr[] = trim($v->find('p p', 0)->plaintext);
}
var_export($arr);
//输出
array (
  0 => '这是一行文字',
  1 => '这是嵌套的一行文字',
)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号