php截取带html的字符串函数,保持html标签的完整性,并考虑标签有嵌套的情况。
实现方法:1.使用preg_split()函数将要截取的字符串按标签分割成数组。
2.遍历数组,如果是起始标签则放入存放起始标签的栈中;如果是结束标签则放入结束标签的栈中;如果是字符串则统计字符串长度。
3.判断字符串长度是否大于等于要截取的长度,若是则标记当前位置,计算并截取遍历的数组得到要截取的字符串。
4.统计起始和结束标签的栈长,起始标签数减去结束标签数就是可能要补全的标签数了,按这个长度截取起始标签数组就得到待补全的标签数组。
5.遍历起待补全的标签数组,挨个取出标签(后进先出),判断是否为单一标签,是单一标签抛弃,不是则补全。
按字数计算,函数如下:
/** * 截取带html标签的字符串 * @param string $str html字符串 * @param int $len 要截取的字数 * @param string $re 结尾链接符 * @return string */ public static function cutHtmlStr($str, $len, $re = ‘...‘) { //$str = str_replace([‘<‘, ‘>‘], [‘<‘, ‘>‘], $str); //实体转html if (strLen($str) <= $len) { return $str; } $filterArr = [‘hr‘, ‘br‘, ‘img‘, ‘area‘]; //不需要补全的标签 $l = 0; $startTag = $endTag = []; $arr = preg_split("/(<\!--.*-->|<[^>]*>)/s", $str, -1, PREG_SPLIT_DELIM_CAPTURE); for ($i = 0, $count = count($arr); $i < $count; $i++) { if ($arr[$i] && $arr[$i][0] == ‘<‘ && $arr[$i][1] != ‘/‘) { $startTag[] = $arr[$i]; //起始标签 continue; } elseif ($arr[$i] && $arr[$i][0] == ‘<‘ && $arr[$i][1] == ‘/‘) { $endTag[] = $arr[$i]; //结束标签 continue; } else { $currStrLen = mb_strwidth($arr[$i], ‘GBK‘); $l += $currStrLen; } //当前获取到的字符串长度大于$len if ($l >= $len) { $str2 = mb_substr($arr[$i], 0, $len - $l + $currStrLen, ‘GBK‘); $arr2Str = implode(‘‘, array_splice($arr, 0, $i)); $returnArr = [$arr2Str, $str2, $re]; //取出可能需要配对的标签 $j = count($startTag) - count($endTag); if ($j == 0) { break; } $htmlTagArr = array_splice($startTag, 0, $j); for ($j--; $j >= 0; $j--) { $re = preg_match(‘/<(\w+)(\s*.*)?>/i‘, $htmlTagArr[$j], $tagArr); if ($re && !in_array($tagArr[1], $filterArr)) { $returnArr[] = ‘</‘ . $tagArr[1] . ‘>‘; } } break; } } return implode(‘‘, $returnArr); }
时间: 2024-10-16 18:49:16