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

    Проблема возникает из-за того, что разбиение на страницы происходит для фиксированного количества символов.
    $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>
    		<?
    	}
      }
    } ?>
    Ответ написан
    7 комментариев