截断/缩短文本会导致 HTML 实体出现编码错误

问题描述 投票:0回答:1

我正在建立一个有关健康的网站。我需要在表格中显示一些症状及其数据。然而,某些症状的名称太长,导致布局问题。因此,我找到了一种使用 PHP 缩短它们名称的方法,如下所示:

<?=strlen($a)>45 ? stripslashes(substr($a, 0, 45)."...") : stripslashes($a)?>

效果很好。唯一的问题是当字符串在 HTML 实体 的中间被切割时,这会导致浏览器显示带有问号的菱形 (http://prntscr.com/dzqyps)。

示例:

原串:

超过 x 个字符的长字符串以 já 结尾

截断的字符串:

超过 x 个字符的长字符串以 j&aa 结尾...

浏览器中显示的字符串:

超过 x 个字符的长字符串以 j 结尾?...

如何解决这个问题?

php string html-entities
1个回答
0
投票

哈哈...我能在很短的时间内做到最好...也许有一种更优雅的方法,但它有效。它仍然非常粗糙和尖锐,并且没有考虑到第一个切断字符串末尾附近有“&”的文本。但只是为了给你一个想法。希望变量名称可以帮助您弄清楚。希望它有帮助,祝你好运......

$text = "long string with more than x characters ends j&aacute long stri";
$maxDisplayableLength = 51; // Would cut in j&acute in half!!!

$partOne = substr($text, 0, $maxDisplayableLength);
$partTwo = substr($text, $maxDisplayableLength, (strlen($text)-$maxDisplayableLength));
// Now go back max 8 positions (longest &-code)
$inspectLastEightChars  = substr($partOne, -8, 8);
$positionAmpersand      = stripos( $inspectLastEightChars, "&");
if ($positionAmpersand !== false) { // Ohoh, '&' is found
   $correctedPartOne = substr($partOne, 0, (strlen( $partOne ) - 8 + $positionAmpersand));
   $prePendToPartTwo = substr( $inspectLastEightChars, $positionAmpersand, (strlen($inspectLastEightChars)-$positionAmpersand));
   $correctedPartTwo = $prePendToPartTwo.$partTwo;
}
echo('$correctedPartOne: '.$correctedPartOne.'<br />'.'$correctedPartTwo: '.$correctedPartTwo.'<br />'.'Combined: '.$correctedPartOne.$correctedPartTwo);

结果:

$correctedPartOne: long string with more than x characters ends j
$correctedPartTwo: á long stri
Combined: long string with more than x characters ends já long stri
© www.soinside.com 2019 - 2024. All rights reserved.