2013-09-16 63 views
0

我知道各种方法来截断HTML字符串到一定的长度,包括/不包括作为结果的一部分的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...

编辑:

(张贴的答案)

+3

它们转换成字符,然后截断,然后再转换回HTML标签。 – Pitchinnate

+2

http://php.net/manual/en/function.html-entity-decode.php – user2180613

+0

@Pitchinnate几乎可以工作,但不是完全适用于所有html字符 - 例如:•没有转换 – WOUNDEDStevenJones

回答

0

我试图

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/(链接在Shortening text tweet-like without cutting links inside)完美工作 - 处理htmltags,保留整个单词(或不)和htmlentities。现在,它只是:

function truncateIfNecessary($string, $length) { 
    if(strlen($string) > $length) { 
     return truncateHtml($string, $length, "...", true, true); 
    } else { 
     return strip_tags($string); 
    } 
} 
0

我觉得你的问题将得到解决d通过将第一行代码更改为:

$result = strip_tags(truncateIfNecessary($fullText, 100)); 

这样您首先调整长度并在此之后照顾HTML字符。

+0

这将工作,但我相信这会导致不正确的长度,因为它会考虑标签作为长度的一部分。最终结果可能不会比100个字符短。 – WOUNDEDStevenJones

+0

@WOUNDEDStevenJones是的你是对的,在函数开始时解码并在最后编码将是我认为更好的解决方案。 – SharpKnight

+0

我也尝试过,它并没有100%的效果,但它比我开始的时间要紧密得多。看到我编辑的问题。 – WOUNDEDStevenJones

0

使用wordwrap 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 
+1

这是否与html特殊字符有关...? – WOUNDEDStevenJones

+0

不,这个wordwrap函数只能使用空格char作为分隔符从一个给定的字符串中提取X个字符(总是提取确切的单词)。 –

+0

@WOUNDEDStevenJones其实,是的。语义上的HTML实体是单词,所以你要么将它们全部放入,要么根本不放入。尽管应该对没有空格的文本进行特殊处理。另外我建议使用'\ 0'而不是'\ n'。 – user

0
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; 
}