Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Как правильно добавить в php файл код обрезки строки по количеству символов и многоточие в конце?

#php


На stackoverflow в одном из ответов (https://ru.stackoverflow.com/a/190992/232533)
нашел код для вставки в php с помощью которого можно обрезать строку по определенному
количеству символов и добавить троеточие в конце. Вот найденный код :

{$text1 = "Допустим здесь ваш текст из 1000 символов";
 $text = mb_substr($text1,0,140, 'UTF-8'); //140 это кол. знаков 
 $str_count = substr_count($text," "); // возвращает количество пробелов
 $text = explode(" ", $text1); //количество слов 
 for($i=0;$i<$str_count; $i++){ echo $text[$i].' '; } echo "...";}


Со слов автора данного кода, этот код не будет обрезать слова (по среди слова), а
количество символов не будет превышать указанное количество и будет добавлено троеточие
после обрезного текста.

В моем php файле (весь код файла ниже) есть строка:  'item_intro'=>mb_strimwidth(strip_tags($row->introtext,''.$allow_tags.''),0,$chars,
"..."), с помощью которой удалось обрезать строку по количеству символов (значение
берется из настроек модуля и  указано в переменной $chars)и после обрезки добавить
троеточие после текста.

Вроде все хорошо текст режиться троеточие добовляеться, но проблема в том, что слова
могут обрезаться по середине слова, а хотелось бы чтобы в тексте до троеточия были
только целые слова, что вроде как возможно сделать с помощью найденного кода (указан
выше). У меня к сожалению не хватает знаний, сколько не бился, как прикрутить найденный
код к моему php файлу. Помогите пожалуйста грамотно добавить найденный код в мой php-файл

Мой исходный php файл: 


get('id');
			global $aid;
			$aid				= $user->get('aid', 0);
			$contentConfig 		= JComponentHelper::getParams( 'com_content' );
			$access2			= !$contentConfig->get('shownoauth');
			$nullDate			= $db->getNullDate();
			$date 				= JFactory::getDate();
			if(intval(JVERSION) >= 3 ){	
				$now =         $date->toSql() ; 
			}else{
				$now =         $date->toMySQL(); 
			}
			/* prepare default module params */
			$yj_mod_name		= basename(dirname(__FILE__));// 10-8-2011
			$item_source		= $params->get   ('item_source',1);// 10-8-2011
			switch ($item_source) {
				case 1 :   
					require('modules/'.$yj_mod_name.'/yjme/get_joomla.php');
					require_once('modules/'.$yj_mod_name.'/yjme/jomfunctions.php');
					break; 
				case 2:  
					require('modules/'.$yj_mod_name.'/yjme/get_k2.php');
					require_once('modules/'.$yj_mod_name.'/yjme/k2functions.php');
					break;
			}

			//  this is the main array for k2/joomla news items. both use same vars for ouptut
			$main_yj_arr = array();
			foreach ( $load_items as $row ) {

				switch ($item_source) {
					case 1 :
						$item_url 		= yjme_get_url($row);
						$img_url  		= yjme_art_image($row);
						$cat_url 		= yjme_get_cat_url($row);
						$author_url		= yjme_get_author_url($row);
						$advert_url		= yjme_advert($row);
						$advert_img		= yjme_advert_img($row);
						$item_media		= yjme_media($row);
						$item_hook		= yjme_hookon($row);
						$item_playlist	= yjme_playlist($row);
						if(JPluginHelper::getPlugin('system', 'jcomments')){
								$config = JCommentsFactory::getConfig();
								$categories = $config->get('enable_categories');
								$ids = explode(',', $categories);
								if(in_array($row->catid,$ids)){
									//print_r($ids);
									$comments_on = 1;
									$comments_count =  $row->ccount;
								}else{
									$comments_on = 0;
									$comments_count =  0;
								}
						}else{
							$comments_on 	= 0;
							$comments_count = 0;
						}
					break;
						case 2:
						$img_url 		= k2_yjme_art_image($row);
						$item_url		= k2_yjme_get_url($row);
						$cat_url 		= k2_yjme_get_cat_url($row);
						$author_url		= k2_yjme_get_author_url($row);
						$advert_url		= k2_yjme_advert($row);
						$advert_img		= k2_yjme_advert_img($row);
						$item_media		= k2_yjme_media($row);
						$item_hook		= k2_yjme_hookon($row);
						$item_playlist	= k2_yjme_playlist($row);
						$comments 		= json_decode($row->categoryparams);
						if(isset($comments->itemComments)){
							$comments_on 	=  $comments->itemComments;
							$comments_count =  $row->ccount;
						}else{
							$comments_on = 0;
							$comments_count =  0;
						}
					break;
				}

				$yj_get_items = array(
						'item_title' 		=> htmlspecialchars($row->title, ENT_QUOTES, 'UTF-8'),
						'item_url' 			=> $item_url,
						'item_intro' 		=> mb_strimwidth(strip_tags($row->introtext,''.$allow_tags.''),0,$chars,
"..."),
						'img_url' 			=> $img_url,
						'cat_title' 		=> htmlspecialchars($row->cattitle, ENT_QUOTES, 'UTF-8') ,
						'cat_url' 			=> $cat_url,
						'item_author' 		=> $row->username,
						'item_author_rn' 	=> $row->realname,
						'author_url' 		=> $author_url,
						'item_date' => JHTML::_('date', $row->created,JText::_('YJ_DATE_FORMAT')),
						'item_id'	 		=> $row->id,
						'advert_url'	 	=> $advert_url,
						'advert_img'	 	=> $advert_img,
						'item_hits'	 		=> $row->hits,
						'item_likes' 		=> $row->likes,
						'item_comments' 	=> $comments_on,
						'comments_count' 	=> $comments_count,
						'item_media' 	 	=> $item_media,
						'item_hook' 	 	=> $item_hook,
						'item_playlist'	 	=> $item_playlist,
					);
					$main_yj_arr[] = $yj_get_items;
			}
			
					return $main_yj_arr;

		}
		
		
	}
}

?>




Если приведенный выше найденный код не совсем подходит для решения моей задачи, буду
признателен за решение, как это можно реализовать по другому.
    


Ответы

Ответ 1



А у меня получилось так: $length) { $repl = mb_substr($repl, 0, $length) . '...'; } else if ($lr < $lt) { $repl .= '...'; } return $repl; } ?>

Длина исходной строки: .

= 0; $i--) { echo ""; } ?>
До скольки символов обрезать Результат
$i".reduction($text, $i)."
Результат: Длина исходной строки: 41. До скольки символов обрезать Результат 46 'Laravel стремится!!! Это относится и к!!!' 45 'Laravel стремится!!! Это относится и к!!!' 44 'Laravel стремится!!! Это относится и к!!!' 43 'Laravel стремится!!! Это относится и к!!!' 42 'Laravel стремится!!! Это относится и к!!!' 41 'Laravel стремится!!! Это относится и к!!!' 40 'Laravel стремится!!! Это относится и к...' 39 'Laravel стремится!!! Это относится и к...' 38 'Laravel стремится!!! Это относится и к...' 37 'Laravel стремится!!! Это относится и...' 36 'Laravel стремится!!! Это относится и...' 35 'Laravel стремится!!! Это относится...' 34 'Laravel стремится!!! Это относится...' 33 'Laravel стремится!!! Это...' 32 'Laravel стремится!!! Это...' 31 'Laravel стремится!!! Это...' 30 'Laravel стремится!!! Это...' 29 'Laravel стремится!!! Это...' 28 'Laravel стремится!!! Это...' 27 'Laravel стремится!!! Это...' 26 'Laravel стремится!!! Это...' 25 'Laravel стремится!!! Это...' 24 'Laravel стремится!!! Это...' 23 'Laravel стремится...' 22 'Laravel стремится...' 21 'Laravel стремится...' 20 'Laravel стремится...' 19 'Laravel стремится...' 18 'Laravel стремится...' 17 'Laravel стремится...' 16 'Laravel...' 15 'Laravel...' 14 'Laravel...' 13 'Laravel...' 12 'Laravel...' 11 'Laravel...' 10 'Laravel...' 9 'Laravel...' 8 'Laravel...' 7 'Laravel...' 6 'Larave...' 5 'Larav...' 4 'Lara...' 3 'Lar...' 2 'La...' 1 'L...' 0 '...' А если заменить мою функцию reduction() на вариант из ответа @Эдуард, то получается так: Длина исходной строки: 41. До скольки символов обрезать Результат 46 'Laravel стремится!!! Это относится и к!!!' 45 'Laravel стремится!!! Это относится и к!!!' 44 'Laravel стремится!!! Это относится и к!!!' 43 'Laravel стремится!!! Это относится и к!!!' 42 'Laravel стремится!!! Это относится и к!!!' 41 'Laravel стремится!!! Это относится и к!!!' 40 'Laravel стремится!!! Это относится и ... ' 39 'Laravel стремится!!! Это относится и ... ' 38 'Laravel стремится!!! Это относится и ... ' 37 'Laravel стремится!!! Это относится и ... ' 36 'Laravel стремится!!! Это относится ... ' 35 'Laravel стремится!!! Это относится ... ' 34 'Laravel стремится!!! Это ... ' 33 'Laravel стремится!!! Это ... ' 32 'Laravel стремится!!! Это ... ' 31 'Laravel стремится!!! Это ... ' 30 'Laravel стремится!!! Это ... ' 29 'Laravel стремится!!! Это ... ' 28 'Laravel стремится!!! Это ... ' 27 'Laravel стремится!!! Это ... ' 26 'Laravel стремится!!! Это ... ' 25 'Laravel стремится!!! Это ... ' 24 'Laravel стремится!!! ... ' 23 'Laravel стремится!!! ... ' 22 'Laravel стремится!!! ... ' 21 'Laravel стремится!!! ... ' 20 'Laravel ... ' 19 'Laravel ... ' 18 'Laravel ... ' 17 'Laravel ... ' 16 'Laravel ... ' 15 'Laravel ... ' 14 'Laravel ... ' 13 'Laravel ... ' 12 'Laravel ... ' 11 'Laravel ... ' 10 'Laravel ... ' 9 'Laravel ... ' 8 'Laravel ... ' 7 'Laravel ... ' 6 'Laravel ... ' 5 'Laravel ... ' 4 'Laravel ... ' 3 'Laravel ... ' 2 'Laravel ... ' 1 'Laravel ... ' 0 'Laravel ... ' Как это прикрутить к вашему коду: $text1 = "Допустим здесь ваш текст из 1000 символов"; /* здесь вставляете функцию `reduction()` - Эдуарда или мою... */ echo reduction($text1, 140);

Ответ 2



Буквально сегодня писал такую же задачу для другого форума - посмотрите на результат этого кода: $text = 'Laravel стремится преобразить процесс разработки PHP, это относится и к локальной среде разработки. Vagrant обеспечивает простой, элегантный способ настройки управления виртуальными машинами.'; echo reduction($text); function reduction($text, $length = 70) { if (mb_strlen($text, 'UTF-8') > $length) { $substr = mb_substr($text, 0, $length, 'UTF-8'); $text = strpos($substr, ' ') !== false ? preg_replace('~(\s)?(?(1)\S+$|\s$)~', '', $substr) : strstr($text, ' ', true); $text .= ' ... '; } return $text; } UPD: Посмотреть результат

Комментариев нет:

Отправить комментарий