【问题标题】:remove comments from html source code从 html 源代码中删除注释
【发布时间】:2011-06-10 11:23:09
【问题描述】:

我知道如何通过 cUrl 获取 html 源代码,但我想删除 html 文档上的 cmets(我的意思是 <!-- .. --> 之间的内容)。另外,如果我可以只取html文档的BODY。谢谢。

【问题讨论】:

  • 你应该手动重新解析它们......我有我自己的 JavaScript 库,但我不知道你怎么能在 PHP 中实现它
  • 这里没有 cUrl 选项吗?

标签: php curl


【解决方案1】:

试试PHP DOM*:

$html = '<html><body><!--a comment--><div>some content</div></body></html>'; // put your cURL result here

$dom = new DOMDocument;
$dom->loadHtml($html);

$xpath = new DOMXPath($dom);
foreach ($xpath->query('//comment()') as $comment) {
    $comment->parentNode->removeChild($comment);
}

$body = $xpath->query('//body')->item(0);
$newHtml = $body instanceof DOMNode ? $dom->saveXml($body) : 'something failed';

var_dump($newHtml);

输出

string(36) "<body><div>some content</div></body>"

【讨论】:

  • 看它运行良好,我从未听说过 DOM。谢谢。
  • 要使多行原始 HTML 工作并且不显示 &amp;#13; 作为换行符,请将 saveXML() 更改为 saveHTML()。要使结果包含&lt;html&gt; 元素,请将loadHTML($html) 更改为loadHTML($html, LIBXML_HTML_NODEFDTD) 并将$newHtml 行更改为$newHtml = $body instanceof DOMNode ? $dom-&gt;saveHTML() : 'something failed';
【解决方案2】:

如果在 cUrl 中没有此选项(我怀疑没有,但我之前错了),那么您至少可以使用 PHP @987654322 将生成的 HTML 解析为您心中的内容@parser.

从长远来看,这可能是您在可配置性和支持方面的最佳选择。

【讨论】:

  • 正确,curl 中没有这样的选项。它只是在服务器发送数据时获取数据。
【解决方案3】:

Regex 为我解决了这个问题,如下所示:

function remove_html_comments($html = '') {
    return preg_replace('/<!--(.|\s)*?-->/', '', $html);
}

【讨论】:

    【解决方案4】:

    我会将它通过管道传递给 sed 用于正则表达式,例如

    curl http://yoururl.com/test.html | sed -i "s/<!\-\-\s?\w+\s?\-\->//g" | sed "s/.?(<body>.?</body>).?/\1/"
    

    正则表达式可能不准确,但你明白了......

    【讨论】:

      【解决方案5】:

      我遇到了在 foreach 循环中修改 DOMNodeList 的问题,该循环消失了我 iterated backwards through the list。出于这个原因,我不会推荐一个foreach 循环作为接受的答案。而是使用这样的for 循环:

      $dom = new DOMDocument();
      $dom->loadHTML($html);
      $xpath = new DOMXPath($dom);
      for ($els = $xpath->query('//comment()'), $i = $els->length - 1; $i >= 0; $i--) {
          $els->item($i)->parentNode->removeChild($els->item($i));
      }
      

      【讨论】:

        【解决方案6】:

        在我的情况下这项工作:

        preg_replace('/<!--[\s\S]*?-->/', '', $html);
        

        【讨论】:

          猜你喜欢
          • 2011-05-23
          • 2015-01-09
          • 1970-01-01
          • 2011-02-03
          • 1970-01-01
          • 2012-04-04
          • 2016-11-05
          • 1970-01-01
          • 2012-09-12
          相关资源
          最近更新 更多