PHP обрезать строку до N-символов не разрывая слов

Довольно часто встречаемая задача: обрезать строку до определенного количества символов, и в тот же момент не оставляя в конце обрывки слов. Способов существует великое множество, и все это делают по своему, но я все же предложу свой способ.

Это немного усложненный вариант обрезки строки, общие моменты по обрезке строки перечислены в заметке:

обрезка строк в PHP

Я реализовал это в виде небольшой функции:

1
2
3
4
5
6
7
8
9
10
function crop_str($string, $limit, $after = '')
{
 
 if (strlen($string) > $limit) {
 $substring_limited = substr($string, 0, $limit); //режем строку от 0 до limit
 $return = substr($substring_limited, 0, strrpos($substring_limited, ' ')) . $after;
 } else
 $return = $string;
 return $return;
}

В принципе все расписано в комментариях, но все же опишу процесс, если кому-то вдруг будет непонятно

У функции два параметра: строка, которую режем и длина обрезанного текста.
Сначала обрезаем строку до установленного количества символов, а потом эту же подстроку обрезаем до последнего пробела.

Пример:

1
2
3
4
5
6
$string = '43 43 43 43 43 43 43 43 43 43 43 4343 443 434343 43 43 vv 43 43 43 43 43 43 43 4343  43';
$limit = 43;   
 
$new_string = crop_str($string, $limit);
echo     'Limit: ' . $limit . '<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String: ' . str_replace($new_string, '<strong>' . $new_string . '</strong>', $string) .'<br/>Strlen: ' . strlen($string);
echo '<br/>Substring: ' . $new_string . '<br/>Strlen: ' . strlen($new_string);

Результат:

Limit: 43
String: 43 43 43 43 43 43 43 43 43 43 43 4343 443 434343 43 43 vv 43 43 43 43 43 43 43 4343 43
Strlen: 87
Substring: 43 43 43 43 43 43 43 43 43 43 43 4343 443
Strlen: 41

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


  1. Rena

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

    function crop_str($string, $limit)
    {

    if (strlen($string) >= $limit ) {
    $substring_limited = substr($string,0, $limit);
    return substr($substring_limited, 0, strrpos($substring_limited, ‘ ‘ ));
    } else {

    //Если количество символов строки меньше чем задано, то просто возращаем оригинал
    return $string;
    }
    }

  2. admin

    Да, в принципе уже и сделал, тут только обновить забыл =)

  3. Илья

    Спасибо. Иногда простые вещи быстро забываются. К функции можно добавить многоточие после обрезки, чтобы смысл обрезки был понятен.

  4. Александр

    Вообще-то функция берет не последний пробел в уже обрезанной строке, а первый встречный! Как исправить?

  5. admin

    Александр, как Вы ее вызываете?

  6. Александр

    return substr($substring_limited, 0, strrpos($substring_limited, ‘ ‘)); — вот так и вызываю,
    strrpos($substring_limited, ‘ ‘)) — берет первый попавшийся пробел, разве не так?

  7. Александр

    вот мое решение
    $string = substr($string, 0, strripos(substr($string,0,$limit),’ ‘));

  8. 1

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

    «Если строка обрежется, скажем,…»




YouTube бесплатно навести проклятие порчу