Saibotiwe
@Saibotiwe
Начинающий новичек

Как вывести текст из MySQL без непечатаемого пробела (& nbsp; )?

Есть сайт-книга.
5987d0708e1145de971681be6a62c083.png

Текст берется из базы данных, который в свою очередь заносится через визуальный редактор.
b367e286823f4b719454d62020a6bddc.png

Что нужно сделать,чтобы не выводился & nbsp; ?
  • Вопрос задан
  • 3493 просмотра
Решения вопроса 1
Проблема возникает из-за того, что разбиение на страницы происходит для фиксированного количества символов.
$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>
		<?
	}
  }
} ?>
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
$data['text'] = htmlspecialchars_decode($data['text']);

И не используйте функции mysql_*, они уже год как в статусе deprecated. Переходите на mysqli_* или PDO.
Ответ написан
fornit1917
@fornit1917
Выводить как HTML например. Без htmlencode.
Ответ написан
Комментировать
Saibotiwe
@Saibotiwe Автор вопроса
Начинающий новичек
Как здесь вывести?
<?php while ($data = mysql_fetch_array($qr_result)) {
 $count_pages = ceil(strlen($data['text']) / 850);
                        for($i = 0; $i < $count_pages; $i++) {
                            $text = substr($data['text'], $i*850, 850);
                            ?>
                            <div>
                                <p><?=$text?></p>
                            </div>
                            <?
                        }
                    }; ?>
Ответ написан
Комментировать
zooks
@zooks
Frontend
Сам сайт-книгу поправить, выяснить почему он некорректно выводит символы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы