我知道有多种方法可以将HTML字符串截断到一定长度,包括/不包括HTML标签作为结果的一部分和/或在保留整个单词等的同时截断。 但是,我的问题是字符串是否包含特殊字符,例如–
或&
我需要将字符串截断为 100 个字符(如果它会在特殊字符中间截断,则更少截断几个)。 现在我有一个功能:
$result= truncateIfNecessary(strip_tags($fullText), 100); //ignore HTML tags
function truncateIfNecessary($string, $length) {
if(strlen($string) > $length) {
return substr($string, 0, $length).'...';
} else {
return $string;
}
}
但是,如果字符串类似于 text text – text
(在页面上显示为:text text - text
并且$length
落在–
中,它会返回text text &nda...
,当我需要它返回 text text...
时,它显示得完全一样。
编辑:
(作为答案发布)
我认为通过将第一行代码更改为:
$result = strip_tags(truncateIfNecessary($fullText, 100));
这样,您首先调整长度,然后处理HTML字符。
使用自动换行 php 函数。
像这样:
$result = wordwrap(strip_tags($fullText), 100, "...n"); // Remove HTML and split
$result = explode("n", $result);
$result = $result[0]; // Select the first group of 100 characters
我试过
了function truncateIfNecessary($string, $length) {
if(strlen($string) > $length) {
$string = html_entity_decode(strip_tags($string));
$string = substr($string, 0, $length).'...';
$string = htmlentities($string);
return $string;
} else {
return strip_tags($string);
}
}
但由于某种原因,它错过了一些–
和•
. 目前,我发现 http://alanwhipple.com/2011/05/25/php-truncate-string-preserving-html-tags-words/的解决方案(链接在缩短文本推文状,无需在内部剪切链接)工作得很好 - 处理 html标签、保留整个单词(或不保留)和 html实体。 现在只是:
function truncateIfNecessary($string, $length) {
if(strlen($string) > $length) {
return truncateHtml($string, $length, "...", true, true);
} else {
return strip_tags($string);
}
}
function _truncate($string,$lenMax = 100) {
$len = strlen($string);
if ($len > $lenMax - 1) {
$string = substr(strip_tags($string),0,$lenMax);
$string = substr($string,0,strrpos($string," ")).'...';
}
return $string;
}