@NiceScript

Как удалять последние слова на каждой строке, если длина строки больше 30 символов?

Нужно: Удаление последнего слова на каждой строке, если длина строки больше 30 символов. Текст отправляется по форме
Логика:
1) Получение списка всех заголовков из формы и создание массива заголовков (здесь всё гуд)
if (isset($_POST['text'])) $text = nl2br($_POST['text']);
	$show_text = str_replace( "<br />", '', $text );
	//создаём массив текста из каждой строки
	$result = explode("\n", trim($_POST['text']," "));

2) Определяем длину каждого заголовка (тут всё хорошо показывается)
$last_i = count($result)-1;
	if (count($result) > 1) {
		for ($i=0; $i < count($result); $i++) {
			switch ($i) { 
					case 0: {
						$thiscount = (iconv_strlen($result[$i], 'utf-8')-1);
						//echo "</br>".$result[$i]." ";						
						//echo $thiscount;
						$Counts[$i] = $thiscount;
						continue;
					}
					case $last_i: {
						$thiscount = iconv_strlen($result[$i], 'utf-8');
						//echo "</br>".$result[$i]." ";
						//echo $thiscount;
						$Counts[$i] = $thiscount;
						continue;
					}
					default: {
						$thiscount = (iconv_strlen($result[$i], 'utf-8')-1);
						//echo "</br>".$result[$i]." ";
						//echo $thiscount;
						$Counts[$i] = $thiscount;
						continue;
					}
			}
		}
	};
	if (count($result) == 1) {
		$thiscount = (iconv_strlen($result[0], 'utf-8'));
		$Counts[0] = $thiscount;
		//echo $thiscount;
	}

3) Создаём Массив который содержит номер заголовка, его текст и длину текста(тут тоже всё гуд)
for ($i = 0; $i<count($result); $i++) {
		$TextAndCount = array();
		$TextAndCount[$result[$i]] = $Counts[$i];
		$TextAndCounts[] = $TextAndCount;
	}

Проблема в том, чтобы удалять последнее слово, пока длина текста будет не больше 30 символов.
Пытаюсь реализовать, но то зависание браузера, то обрабатывает криво. Помогите, пожалуйста.
foreach ($TextAndCounts as $i => $j){
		foreach ($j as $k => $v) {
			//echo $k."</br>";
			if ($v > 30) {
				while($v > 30) {
					$k = preg_replace("/\\s\\S+$/u", "", $k);
					$v = iconv_strlen($k, "utf-8");					
				}
				echo $k." ".$v."</br>";		
			} else echo "Меньше 30".$k."</br>";
		}
	}
  • Вопрос задан
  • 178 просмотров
Решения вопроса 1
Попробуйте
$k = trim(preg_replace("/\\s\\S+$/u", "", $k));

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

P.S. Или попробовать перед циклом убрать все переводы строк и лишние пробелы.
P.P.S. Для тестирования введите еще счетчик, чтобы избежать вечного цикла:

$c = 0;
while($v > 30 && $c < 100) {
     $c++;
     $k = preg_replace("/\\s\\S+$/u", "", $k);
     $v = iconv_strlen($k, "utf-8");					
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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