我知道我的回答並不是很好的道德規範,因爲我沒有足夠的時間來解釋它的每一部分是如何工作的。但這是我用來裁剪字符串和維護HTML代碼的功能。
function truncate($text, $length, $suffix = '…', $isHTML = true) {
$i = 0;
$simpleTags=array('br'=>true,'hr'=>true,'input'=>true,'image'=>true,'link'=>true,'meta'=>true);
$tags = array();
if($isHTML){
preg_match_all('/<[^>]+>([^<]*)/', $text, $m, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
foreach($m as $o){
if($o[0][1] - $i >= $length)
break;
$t = substr(strtok($o[0][0], " \t\n\r\0\x0B>"), 1);
if($t[0] != '/' && (!isset($simpleTags[$t])))
$tags[] = $t;
elseif(end($tags) == substr($t, 1))
array_pop($tags);
$i += $o[1][1] - $o[0][1];
}
}
$output = substr($text, 0, $length = min(strlen($text), $length + $i));
$output2 = (count($tags = array_reverse($tags)) ? '</' . implode('></', $tags) . '>' : '');
$pos = (int)end(end(preg_split('/<.*>| /', $output, -1, PREG_SPLIT_OFFSET_CAPTURE)));
$output.=$output2;
$one = substr($output, 0, $pos);
$two = substr($output, $pos, (strlen($output) - $pos));
preg_match_all('/<(.*?)>/s', $two, $tags);
if (strlen($text) > $length) { $one .= $suffix; }
$output = $one . implode($tags[0]);
$output = str_replace('</!-->','',$output);
return $output;
}
後來乾脆像這樣:
truncate($your_string, '80', $suffix = '…', $isHTML = true);
您的代碼將刪除tags.I要指定長度內完成的HTML代碼的HTML。 – 2014-10-06 08:57:50