php截取html字符串

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([‘&lt;‘, ‘&gt;‘], [‘<‘, ‘>‘], $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);
        }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。