加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【正则表达式】使用正则来取html中的正文的bug【原创】

发布时间:2020-12-14 00:46:19 所属栏目:百科 来源:网络整理
导读:今天碰到了一个问题,在写PHP,使用正则表达式来获取html中的body内容的时候,遇到了一个bug,不多说,先上代码,先上要取的html文件: 8/index.html: !DOCTYPE html html head meta charset = "UTF-8" title 你好你好 /title link rel = "stylesheet" href =
今天碰到了一个问题,在写PHP,使用正则表达式来获取html中的body内容的时候,遇到了一个bug,不多说,先上代码,先上要取的html文件:
8/index.html:
   
   
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>你好你好</title> <link rel="stylesheet" href="css/normalize.css"> <link rel="stylesheet" href="css/style.css" media="screen" type="text/css" /></head><body> <div style="text-align:center;clear:both;"> <script src="/follow.js" type="text/javascript"></script> </div> <div class='heart3d'> <div class='rib1'></div> <div class='rib2'></div> <div class='rib3'></div> <div class='rib4'></div> </div></body></html>
没什么特别的html文件。

接着是php文件:
 
    
    
  • <?php/** * 在html文件中找出正文 * Created by PhpStorm. * User: Administrator * Date: 2016/11/15 * Time: 21:43 */$filename = '8/index.html';$res = get_body_from_html($filename);var_dump($res);/** * 在html文件中找出正文 * @param $filename string 路径url * @return array|bool */function get_body_from_html($filename){ if (!file_exists($filename)) { return false; } $file = file_get_contents($filename); $res = array(); preg_match('/<body>(.*)</body>/', $file, $res); return $res;}
    结果一运行发现是空的:
    
       
       array(0) { } 
    为了测试,改了一下方法:
     
        
        
  • function get_body_from_html($filename){ if (!file_exists($filename)) { return false; }// $file = file_get_contents($filename); $file = '<html><head><title>你好</title>></head><body><div>我不好我不好</div></body></html>'; $res = array(); preg_match('/<body>(.*)</body>/', $res); return $res;}
    运行发现没问题:
    
       
       array(2) { [0]=> string(42) "<body><div>我不好我不好</div></body>" [1]=> string(29) "<div>我不好我不好</div>"}


    仔细检查代码,发现没啥问题,遂只好去 segmentfault提问,很快就有了答案:
    是因为正则的问题, .只能匹配除了换行符的所有字符,所以匹配不到html中的,一般要匹配所有字符的话,两种方法,一种是:([sS]*?),s匹配所有的空白,包括空格、换行、tab缩进等所有的空白,而S正好相反,这样sS就匹配所有的字符。[]表示在它里面包含的单个字符不限顺序的出现。类似的还有[wW]等,另外一种是给正则表达式添加模式修饰符/s。

    所以修改后的代码为:
    
       
       <?php/** * 在html文件中找出正文 * Created by PhpStorm. * User: Administrator * Date: 2016/11/15 * Time: 21:43 */$filename = '8/index.html';$res = get_body_from_html($filename);var_dump($res);/** * 在html文件中找出正文 * @param $filename string 路径url * @return array|bool */function get_body_from_html($filename){ if (!file_exists($filename)) { return false; } $file = file_get_contents($filename); $res = array(); preg_match('/<body>([sS]*?)</body>/', $res); return $res[0];}
    或者是:
        
        
    <?php/** * 在html文件中找出正文 * Created by PhpStorm. * User: Administrator * Date: 2016/11/15 * Time: 21:43 */$filename = '8/index.html';$res = get_body_from_html($filename);var_dump($res);/** * 在html文件中找出正文 * @param $filename string 路径url * @return array|bool */function get_body_from_html($filename){ if (!file_exists($filename)) { return false; } $file = file_get_contents($filename); $res = array(); preg_match('/<body>(.*)</body>/s', $res); //这一种方法也可以 return $res[0];}


    运行之后就没问题了:
    
       
       string(280) "<body> <div style="text-align:center;clear:both;"> <script src="/follow.js" type="text/javascript"></script> </div> <div class='heart3d'> <div class='rib1'></div> <div class='rib2'></div> <div class='rib3'></div> <div class='rib4'></div> </div></body>"

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读