Как бы сделали вы: обрезание строки не ломая слова и исключая знаки препинания

nick4

Guest
Как бы сделали вы: обрезание строки не ломая слова и исключая знаки препинания

я сделал вот так, и хочу услышать критику, в случае если можно сделать более оптимальнее или "идеальнее по функциональности":

PHP:
$end = exploder("", "&*^[{(:;/,@#");

 function is_simb($simb) {
  global $end;
  foreach ($end as $sb) {
   if ($simb==$sb) return false;
  }
  return true;
 }

 function exploder($explode, $string) {
  if (empty($explode)) {
   for ($i=0;$i<strlen($string);$i++) {
    $return[] = $string[$i];
   }
   return $return;
  }
  return explode($explode, $string);
 }

 function substr_words($string, $end=250) {
  # Укорачиваем на определенное кол-во символов
  $string = substr($string, 0, $end);
  $string = explode(" ", $string);

  # Удаляем последнее слово в 90% случае обрезанное
  unset($string[count($string)-1]);

  # Соединяем массив пробелом и делаем реверс строки, 
  # для того чтобы пройтись по конечным символам в поисках
  # элемента из переменной $end
  $string = strrev(implode(" ", $string));

  # Делим строку по-символьно в массив
  $string = exploder("", $string);
  $i=0;
   foreach ($string as $str) {
    if (is_simb($str)) break;
    unset($string[$i]);
    $i++;
   }
   
  return strrev(implode("", $return));
 }


echo substr_words("Обрезать строку до определенного количества символов:, тест", 56);
 

nick4

Guest

nick4

Guest
Originally posted by tony2001
я не понял что ты хочешь сказать.
я имею ввиду что smarty обрезал строку до слова "количества", хотя можно было вытащить еще одно слово - удалив при этом конечные знаки препинания. :cool:
 

tony2001

TeaM PHPClub
nick4
а, теперь понял.
ну так добавь еще один рег (а проще - str_replace по списку) туда - и получишь то же самое, но в 3 раза короче.
 

nick4

Guest
Originally posted by tony2001
nick4
а, теперь понял.
ну так добавь еще один рег (а проще - str_replace по списку) туда - и получишь то же самое, но в 3 раза короче.
не понял, куда добавить?
str_replace на всю строку?
мне это не надо
 

13i

Новичок
хех...сам долго искал ответ на этот вопрос...

вот один из вариантов:

$text=substr($text, 0, rindex($text, ' ', $chars));
 

sakon

П..и.н..ок
Ты на год топика посмотрел?
Во блин диггеров развелось...
 
Сверху