【问题标题】:Extracting the body HTML and clean comments using PHP and Regex使用 PHP 和 Regex 提取正文 HTML 和干净的注释
【发布时间】:2015-05-01 15:12:57
【问题描述】:

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

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

问题是什么都没有发生。评论将保留在原处或任何清理工作,没有任何反应。你能帮我吗?谢谢!

编辑:

感谢@mhall,我发现由于&lt;body&gt; 标记中的属性,我的正则表达式不起作用。我使用他的代码并更新:

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

这项工作完美!

谢谢大家!

【问题讨论】:

  • 为什么要清理 cmets?您可以使用DOMDocument 或其他文档解析器来更轻松地完成此操作。
  • 不谈使用正则表达式的不相关性,我认为您的问题来自&lt;body&gt;(.*?)&lt;\/body&gt; 部分。默认情况下,“。”不包括换行符。您可能想用[\s\S] 替换它## 编辑:没关系,没有看到“s”标志。
  • @ExplosionPills 我想要一种简单的方法来清理 HTML 中的一些内容。
  • 对我有用 (PHP 5.5.14),但它也删除了 &lt;body&gt;/&lt;/body&gt; 标签。你想用什么字符串?

标签: php html regex html-parsing


【解决方案1】:

试试这个。对preg_replace_callback 进行了修改,不包含body 标签,并在preg_replace 中将(.|\s) 替换为.*。还从中删除了array 语法并添加了/s 修饰符:

$str = <<<EOS
<html>
    <body>
        <p>
             Here is some <!-- One comment --> text
             with a few <!--
                Another comment
             -->
             Comments in it
        </p>
    </body>
</html>
EOS;

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

echo $str, PHP_EOL;

输出:

<html>
    <body>
        <p>
             Here is some  text
             with a few 
             Comments in it
        </p>
    </body>
</html>

【讨论】:

  • 你的body标签是否有任何类声明等,还是只是一个普通的&lt;body&gt;
【解决方案2】:

你是不是太复杂了?你不需要通过回调跳进跳出,因为preg_replace 会在每场比赛中进行替换:

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

将字符串拆分为 head 和 body 可以将 head 排除在替换之外,而不会出现很多混乱的正则表达式。 注意模式后面的s'/.../s'。这使得正则表达式中的点与其他字符匹配嵌入的换行符。

【讨论】:

  • 没有,因为在 标签中我需要为浏览器切换器保留一些 cmets。
  • 哦,我明白了。但是用$parts = explode("&lt;body", $str, 2); 将字符串一分为二,用$parts[1] 替换,然后用$str = $parts[0]."&lt;body".$parts[1]; 重新组合会更干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 2019-03-02
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多