Проблема возникает из-за того, что разбиение на страницы происходит для фиксированного количества символов.
$text = substr($data['text'], $i*850, 850);
Этот код не знает о том, что & nbsp; это один символ. Поэтому амперсанд оказывается на одной странице, а код nbsp; на другой.
Чтобы решить проблему, придется усложнить алгоритм. Например, можно разбить текст на слова, и выводить на одной странице слова, сумма длин которых в сумме с количеством разделителей слов не превышает заданное у вас в коде число 850.
Самое простейшее решение, разбить текст на слова с помощью explode(), более интеллектуальное решение можно реализовать, используя preg_split() и регулярные выражения.
// формируем массив слов
// считаем, что все слова разделены пробелом
$words = explode(' ', $data['text'])
// далее должен идти код, который определит
// какие слова будут выведены на этой странице
Таким образом, у вас не получится разделить символ & nbsp; и другие спецсимволы на две страницы. Надеюсь, что новый алгоритм разбиения вы сможете написать самостоятельно.
P.S. А самое простое и грубое решение, избавиться вообще от источника проблемы:
$data['text'] = html_entity_decode($data['text'], ENT_NOQUOTES);
Документация здесь:
www.php.su/functions/?html-entity-decode
UPD. Набросал недостающий кусок кода. Не тестировал, но должно работать.
<?php
while ($data = mysql_fetch_array($qr_result)) {
$count_pages = ceil(strlen($data['text']) / 850);
// разбиваем текст на слова
$words = explode(' ', $data['text']);
// начинаем вывод с первого слова
$current_word_index = 0;
// формируем текст страницы
$page_text = '';
while ($current_word_index < count($words)){
// если длина текущего текста страницы
// плюс пробел плюс следующее слово меньше 850
if (strlen($page_text . $words[$current_word_index] . ' ') <= 850){
// добавляем слово с пробелом к тексту
$page_text .= $words[$current_word_index] . ' ';
// переходим к следующему слову
$current_word_index++;
}
else{ // в противном случае выводим страницу
?>
<div>
<p><?=$page_text?></p>
</div>
<?
//
$page_text = '';
}
// если мы дошли до последнего слова, то выводим весь оставшийся текст
if ($current_word_index == count($words) - 1){
?>
<div>
<p><?=$page_text . ' ' . $words[$current_word_index]?></p>
</div>
<?
}
}
} ?>