问题如题,先上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>
<p style="text-align:center;clear:both;">
<script src="/follow.js" type="text/javascript"></script>
</p>
<p class='heart3d'>
<p class='rib1'></p>
<p class='rib2'></p>
<p class='rib3'></p>
<p class='rib4'></p>
</p>
</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><p>我不好我不好</p></body></html>';
$res = array();
preg_match('/<body>(.*)<\/body>/', $file, $res);
return $res;
}
运行之后就可以正确输出:
array(2) {
[0]=>
string(42) "<body><p>我不好我不好</p></body>"
[1]=>
string(29) "<p>我不好我不好</p>"
}
所以要请教一下为何写的正则抓不到内容呢?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
@jsoncode 的答案有效, 但是后面的说明不对
'.'在默认情况下匹配的是除了换行符的所有字符, 而不是"所有非空字符"
解决方案有两种, 第一个正是 @jsoncode 提供的
([\s\S]*?)第二种是给正则表达式添加模式修饰符 /s, 这样 . 就是匹配所有字符了
/<body>(.*)<\/body>/s关于所有模式修饰符, 见 http://php.net/manual/zh/refe...
把正则里面的
改成
因为‘.’只能匹配所有非空字符(
更正:点只能匹配除换行符rn之外的所有字符,而不是非空字符),而换行符,缩进,空格等空字符是匹配不到的