PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Nechtus
Отправлено: 06 Января, 2018 - 02:16:04
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Март 2017  


Помог: 0 раз(а)




Здравствуйте, всех с Новым Годом! Вот снова решил к вам обратиться за помощью)) У меня есть код - постраничного вывода текста. Он довольно популярный на просторах сети, я его просто чуть - чуть доработал под себя. Он нормально работает, но есть одна проблема - он разрывает теги. Т.е. при делении текста на равные куски, происходит разрыв парных тегов и всё форматирование летит в тартарары. Вопрос: Можно ли сделать функцию wordwrap более умной, чтобы она при попадании между парными тегами, ставила разделитель после закрывающего тега? Может есть готовые решения или какие мысли? А то я себе уже весь мозг сломал)))
Я помню, что когда-то видел какую-то относительно не сложную проверку на разрыв парных тегов и переноса разделителя, но к сожалению не могу найти теперь тот сайт.

скрипт:
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. $count = mb_strlen($full_article['text'], 'UTF-8');
  4.     if($count > 6000)
  5.     {
  6.     $text = wordwrap ($full_article['text'], 7000, "|", false);
  7.     $pages = explode("|",$text);
  8.      
  9.     if(!isset($_GET["p"])||empty($_GET["p"])){$_GET["p"]=1;}
  10.     else{$p=$_GET["p"];}
  11.     // защита от ввода вместо номера страницы какой-нибудь ерунды
  12.     if(preg_match('/[^0-9]/', $p))
  13.     {die(header("Location:http://Archive"));}  
  14.    
  15.     if($_SERVER['QUERY_STRING']) //если есть параметры в запросе (адресной строке)
  16.     {
  17.         foreach($_GET as $key => $value)
  18.         {
  19.             //формируем строку параметров без номера страницы
  20.             if($key !='p') $uri.="{$key}={$value}&";
  21.         }
  22.     }  
  23.     // если кто-то вводит номер страницы больше, чем всего у нас страниц
  24.     $total=sizeof($pages);
  25.     if($p>$total){$p=$total;}
  26.     print $pages[$p-1];
  27.     #две назад
  28.    print "<div>";
  29.       if(($p-2)>0):
  30.       $ptwoleft="<span id='first_page_link'><a class='first_page_link' href='?{$uri}p=".($p-
  31.      
  32.     2)."'>".($p-2)."</a></span>  ";
  33.     else:
  34.       $ptwoleft=null;
  35.     endif;
  36.            
  37.     #одна назад
  38.    if(($p-1)>0):
  39.       $poneleft="<span id='first_page_link'><a class='first_page_link' href='?{$uri}p=".($p-
  40.      
  41.     1)."'>".($p-1)."</a></span>  ";
  42.       $ptemp=($p-1);
  43.     else:
  44.       $poneleft=null;
  45.       $ptemp=null;
  46.     endif;
  47.            
  48.     #две вперед
  49.    if(($p+2)<=$total):
  50.       $ptworight="  <span id='first_page_link'><a class='first_page_link' href='?{$uri}p=".($p
  51.      
  52.     +2)."'>".($p+2)."</a></span>";
  53.     else:
  54.       $ptworight=null;
  55.     endif;
  56.            
  57.     #одна вперед
  58.    if(($p+1)<=$total):
  59.       $poneright="  <span id='first_page_link'><a class='first_page_link' href='?{$uri}p=".($p
  60.      
  61.     +1)."'>".($p+1)."</a></span>";
  62.       $ptemp2=($p+1);
  63.     else:
  64.       $poneright=null;
  65.       $ptemp2=null;
  66.     endif;      
  67.            
  68.     # в начало
  69.    if($p!=1 && $ptemp!=1 && $ptemp!=2):
  70.       $prevp="<span id='first_page_link'><a href='?{$uri}p=1' class='first_page_link' title='В
  71.    
  72.    начало'><<</a></span> ";
  73.     else:
  74.       $prevp=null;
  75.     endif;  
  76.            
  77.     #в конец
  78.    if($p!=$total && $ptemp2!=($total-1) && $ptemp2!=$total):
  79.       $nextp=" ...  <span id='first_page_link'><a href='?{$uri}p=".$total."'".$total."'
  80.    
  81.    class='first_page_link'>$total</a></span>";
  82.     else:
  83.       $nextp=null;
  84.     endif;
  85.     echo "<br/><div class='pagination'>".$prevp.$ptwoleft.$poneleft."<span class='nav_num_active'>".$p."</span>".$poneright.$ptworight.$nextp."</div>";        
  86.     print "</div>";
  87.     }                    
  88.     else
  89.     {
  90.     echo $full_article['text'];
  91.  
 
 Top
Строитель
Отправлено: 06 Января, 2018 - 17:35:16
Post Id



Участник


Покинул форум
Сообщений всего: 1085
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 39 раз(а)




Nechtus, может быть этот вариант подойдёт:

Функция:
Спойлер (Отобразить)

Использование:
Спойлер (Отобразить)
 
 Top
Nechtus
Отправлено: 06 Января, 2018 - 18:56:08
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Март 2017  


Помог: 0 раз(а)




Строитель пишет:
Nechtus, может быть этот вариант подойдёт:

Функция:
Спойлер (Отобразить)

Использование:
Спойлер (Отобразить)


Спасибо)) Но это не совсем то. Эта функция также режет абзацы и прочие двойные теги типа span или а. Мне нужно, чтобы функция определяла, что если элемент под номером 7000 находиться между тегами <> и </>, то надо сначала дойти до символа за закрывающим тегом, а потом ставить разделитель. Эта же функция делает абсолютно такой же массив, как и у меня.
 
 Top
Nechtus
Отправлено: 07 Января, 2018 - 20:18:12
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Март 2017  


Помог: 0 раз(а)




После двух дней мозгового штурма, я наконец нашёл решение))
Как я и думал оно оказалось очень миниатюрное и изящное))
Я написал свой wordwrap.

Вот функция, может кому понадобиться Радость

PHP:
скопировать код в буфер обмена
  1.  
  2. function htmlwrap($str, $maxLength, $char='|'){
  3.     $count = 0;
  4.     preg_match_all('#<([a-z]+)[^/>]*(?:/>|>(?:.+</\1>))#Uis',$str,$array); // Разбивает текст на куски от тега, до тега. И каждый кусок сохраняется в массив отдельным элементом. Так же создаётся массив с DOM. Регулярное выражение нашёл на просторах инета. Поэтому и не спрашивайте о нём.  
  5.     $count = count($array[0]); //Подсчёт элементов подмассива [0]
  6.     unset($array[1]);// Удаление подмассива [1] ( сюда выносится DOM, но например мне она не нужна)
  7.     $lenstr = strlen($str);//Длина текста
  8.     foreach($array as $val)//Выводим в цикле элементы массива [0]
  9.     {
  10.         for($i=0; $i<=$count; $i++)//перебираем по очереди
  11.         {
  12.             $text.=$val[$i];//составляем воедино.
  13.             $lentext = strlen($text);//длина полученного текста
  14.             $lennewtext = strlen($newText);//длина итогового текста
  15.             $ostatok = $lenstr - $lennewtext; // определяем сколько осталось символов до конца основного текста
  16.             if($lentext >= $maxLength)//условие: Длина собираемого текста должна быть больше или равна допустимому кол-ву символов
  17.             {
  18.                 $newText.= $text.$char; // Итоговый текст + разделитель, по которому будет резаться текст и создаваться пагинация
  19.                 $lentext = 0;
  20.                 $text = '';
  21.             }
  22.             if($ostatok < $maxLength)//условие: остаток меньше допустимого количества символов
  23.             {
  24.                 $newText.= $text; //дописываем последний кусок к уже готовому тексту, но только без последнего разделителя, т.к. он лишний.
  25.                 $lentext = 0;
  26.                 $text = '';
  27.             }
  28.         }
  29.     }
  30.     return $newText; //возвращаем готовый текст
  31.    
  32. }
  33.  


Ну и остаётся только подключить функцию к пагинации(см.выше) и вуаля. Про разрыв абзацев или обрыве на полуслове или полутеге можно забыть))

Специально расписал подробно, чтобы было понятно. А то на очень многих форумах и сайтах вечно швырнут кучу кода, а ты сиди пол-дня и разбирайся откуда ноги растут))

(Отредактировано автором: 07 Января, 2018 - 20:22:09)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Если скрипт не работает »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB