问题如题,先上html文件,需要取里面的body内容,直接上代码:
<!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>
接着是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>/', $file, $res); return $res; }
运行之后就可以正确输出:
array(2) { [0]=> string(42) "<body><div>我不好我不好</div></body>" [1]=> string(29) "<div>我不好我不好</div>" }
所以要请教一下为何写的正则抓不到内容呢?
<p>'.'在默认情况下匹配的是除了换行符的所有字符, 而不是"所有非空字符"</p><p>解决方案有两种, 第一个正是 <br/></p><p>([\s\S]*?)</p><p>第二种是给正则表达式添加模式修饰符 /s, 这样 . 就是匹配所有字符了</p><p>/<body>(.*)<\/body>/s</p><p>关于所有模式修饰符, 见 <a href="http://php.net/manual/zh/reference.pcre.pattern.modifiers.php">http://php.net/manual/zh/reference.pcre.pattern.modifiers.php</a><br/></p><p><br/> </p><p><br/></p>
<p>把正则里面的</p><p>(.*)<br/></p><p>改成</p><p>([\s\S]*?)<br/></p><p>因为‘.’只能匹配所有非空字符,而换行符,缩进,空格等空字符是匹配不到的</p><p><br/></p>