使用PHP和Regex提取正文HTML并清除注释

时间:2015-05-01 15:12:57

标签: php html regex html-parsing

我想使用PHP和正则表达式清除HTML中<body>部分的注释和其他一些垃圾或标签,但我的代码不起作用:

$str=preg_replace_callback('/<body>(.*?)<\/body>/s', 
    function($matches){
        return '<body>'.preg_replace(array(
            '/<!--(.|\s)*?-->/',
        ),
        array(
            '',
        ), $matches[1]).'</body>';
    }, $str);

问题是没有任何反应。评论将保持原样或任何清洁工作,没有任何反应。你能帮我吗?谢谢!

修改

感谢@mhall我认为我的正则表达式因<body>标签中的属性而无效。我使用他的代码并更新:

$str = preg_replace_callback('/(?=<body(.*?)>)(.*?)(?<=<\/body>)/s',
    function($matches) {
        return preg_replace('/<!--.*?-->/s', '', $matches[2]);
    }, $str);

这项工作完美!

谢谢大家!

1 个答案:

答案 0 :(得分:0)

你真的太复杂吗?您不需要通过回调跳入和跳出,因为preg_replace将在每场比赛中进行替换:

$parts = explode("<body", $str, 2);
$clean = preg_replace('/<!--.*?-->/s', '', $parts[1]);
$str = $parts[0]."<body".$clean;

将琴弦分成头部和身体,排除了头部的替换而没有大量凌乱的正则表达式。 请注意模式后的s'/.../s'。这使得正则表达式中的点与其他字符一起匹配嵌入的换行符。