首页 > 代码库 > php截取html字符串

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);        }

 

php截取html字符串