標籤: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([‘<‘, ‘>‘], [‘<‘, ‘>‘], $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字串