Php 截断保存字符串的HTML标记结构

Php 截断保存字符串的HTML标记结构,php,html,truncate,Php,Html,Truncate,我想截断一个包含html标记的字符串,保存它的结构 例如: Hello! My name is Jerald and here is a link to my <a href="#">Blog</a>. $my_input_with_html = 'Hello! My name is Jerald and here is a link to my <a href="#">Blog</a>.'; $my_output_with_correct_ht

我想截断一个包含html标记的字符串,保存它的结构

例如:

Hello! My name is Jerald and here is a link to my <a href="#">Blog</a>.
$my_input_with_html = 'Hello! My name is Jerald and here is a link to my <a href="#">Blog</a>.';
$my_output_with_correct_html = truncateHTML($my_input_with_html, 52);
你好!我的名字是杰拉尔德,这里有一个链接到我的名字。
所以,如果我将其子字符串的最大字符数设置为52,我希望它返回如下字符串:

Hello! My name is Jerald and here is a link to my <a href="#">Bl</a>
你好!我叫Jerald,这是我的

我尝试使用
strip_tags
strlen
函数来计算没有和有html标记的文本,然后设置子字符串的新长度(没有html标记的大小+有html标记的大小)。但是这个方法正在破坏html字符串。

我使用这个,而不是我的代码,但找不到我最初在哪里找到它的:

function truncateHTML($html_string, $length, $append = '&hellip;', $is_html = true) {
  $html_string = trim($html_string);
  $append = (strlen(strip_tags($html_string)) > $length) ? $append : '';
  $i = 0;
  $tags = [];

  if ($is_html) {
    preg_match_all('/<[^>]+>([^<]*)/', $html_string, $tag_matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);

    foreach($tag_matches as $tag_match) {
      if ($tag_match[0][1] - $i >= $length) {
        break;
      }

      $tag = substr(strtok($tag_match[0][0], " \t\n\r\0\x0B>"), 1);
      if ($tag[0] != '/') {
        $tags[] = $tag;
      }
      elseif (end($tags) == substr($tag, 1)) {
        array_pop($tags);
      }

      $i += $tag_match[1][1] - $tag_match[0][1];
    }
  }

  return substr($html_string, 0, $length = min(strlen($html_string), $length + $i)) . (count($tags = array_reverse($tags)) ? '</' . implode('></', $tags) . '>' : '') . $append;
}
函数truncateHTML($html\u string,$length,$append='&hellip;',$is\u html=true){
$html\u string=trim($html\u string);
$append=(strlen(strip_标记($html_字符串))>$length)?$append:“”;
$i=0;
$tags=[];
如果($is_html){

preg_match_all('/]+>([^为什么不使用CSS?使用省略号比截断和丢失数据更好。例如,如果您有一个HTML项目(如新闻/博客文章),您可以使用PHP进行此操作然后你想打印一个项目的逗号。当然,你可以截断正常的,但它可以停止在一些HTML块的中间。
Hello! My name is Jerald and here is a link to my <a href="#">Bl</a>&hellip;