php截取html字串

來源:互聯網
上載者:User

標籤: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字串

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.