2017-01-24 13 views
0

Я создаю сайт о здоровье. И мне нужно отображать некоторые симптомы вместе с их данными в таблице. Однако имена некоторых симптомов слишком велики, что вызывает проблему макета. Итак, я нашел способ, чтобы сократить их имена с PHP, как вы можете увидеть ниже:Усечение/сокращение текста вызывает ошибку кодирования на HTML-объектах

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

Он отлично работает. Единственная проблема заключается в том, что строка вырезается в середине HTML Entity, что заставляет браузер отображать алмаз с вопросительным знаком (http://prntscr.com/dzqyps).

Пример:

Оригинальная строка:

длинная строка с более чем х символов заканчивается J & aacute

Усеченный строка:

длинная строка с более x символов заканчивается j & аа ...

Строка, как показано в браузере:

длинная строка с более чем х символов заканчивается J ...

Как я могу решить эту проблему?

ответ

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 
+0

Спасибо, человек, для вашего щелчка ответ! Отличное решение! Я также добавлю еще одно решение, которое я нашел, которое вырезает строку перед словом с помощью узлов html: http://stackoverflow.com/questions/1104306/how-to-get-first-x-chars-from-a-string -без-режущий-вне-последнее слово – Educative