【问题标题】:How to clip HTML fragments without breaking up tags?如何在不破坏标签的情况下剪辑 HTML 片段?
【发布时间】:2011-01-07 11:46:10
【问题描述】:

假设我有一个包含 HTML 标记的 200 个字符的字符串。我想显示前 50 个字符的预览。无需“拆分”标签。换句话说,片段不应该包含没有</b><b>。任何服务器端处理都应该在 PHP 中。

【问题讨论】:

    标签: php html post tags


    【解决方案1】:

    You should check out Tidy HTML. 只需在前 50 个非 HTML 字符之后将其剪切,然后通过 Tidy 运行以修复 HTML。

    【讨论】:

      【解决方案2】:

      这是一个使用 DOMDocument 的快速可靠的解决方案,它是标准 PHP 的一部分:

      function cut_html ($html, $limit) {
          $dom = new DOMDocument();
          $dom->loadHTML(mb_convert_encoding("<div>{$html}</div>", "HTML-ENTITIES", "UTF-8"), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
          cut_html_recursive($dom->documentElement, $limit);
          return substr($dom->saveHTML($dom->documentElement), 5, -6);
      }
      
      function cut_html_recursive ($element, $limit) {
          if($limit > 0) {
              if($element->nodeType == 3) {
                  $limit -= strlen($element->nodeValue);
                  if($limit < 0) {
                      $element->nodeValue = substr($element->nodeValue, 0, strlen($element->nodeValue) + $limit);
                  }
              }
              else {
                  for($i = 0; $i < $element->childNodes->length; $i++) {
                      if($limit > 0) {
                          $limit = cut_html_recursive($element->childNodes->item($i), $limit);
                      }
                      else {
                          $element->removeChild($element->childNodes->item($i));
                          $i--;
                      }
                  }
              }
          }
          return $limit;
      }
      

      【讨论】:

        【解决方案3】:

        一个简单的方法可能是先到strip_tags(),然后捕获摘录。

        【讨论】:

        • 我同意 - 这是我一直做的。唯一的缺点是你失去了strong、em等的格式以及任何链接——但我总是接受它并继续前进:-)
        【解决方案4】:

        简答:使用DOMDocument::loadHTML($string) 将其转换为DOM,然后遍历树计算文本节点中的字符。当您达到限制时,将该节点的其余部分替换为“...”或空字符串,然后在所有后续节点上简单地调用 $node-&gt;parentNode-&gt;removeChild($node)

        【讨论】:

          猜你喜欢
          • 2014-07-29
          • 2011-10-05
          • 1970-01-01
          • 1970-01-01
          • 2021-12-31
          • 2015-06-05
          • 2022-01-16
          • 1970-01-01
          • 2011-11-26
          相关资源
          最近更新 更多