码迷,mamicode.com
首页 > Web开发 > 详细

php截取html字符串

时间:2014-11-13 12:42:56      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   ar   使用   sp   for   div   

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字符串

标签:style   blog   io   color   ar   使用   sp   for   div   

原文地址:http://www.cnblogs.com/fibre/p/4094320.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!