Это на самом деле как-то просто, и я добавляю этот ответ, потому что предлагаемый дубликат не соответствует вашим потребностям (но он дает некоторые указатели).
Вам нужно вырезать строку максимальной длины, но сохранить последнее слово. Таким образом, вам нужно выяснить положение, в котором нужно обрезать строку (и, если это вообще необходимо, обрезать ее).
Поскольку получение длины (strlen
) и обрезка строки (substr
) - это не ваша проблема (вы уже ее используете), проблема, которую нужно решить это как получить позицию последнего слова в пределах лимита.
Это включает в себя анализ строки и выяснение смещений каждого слова. Обработка строк может выполняться с помощью регулярных выражений. При написании этого, он напоминает мне о действительно более похожем вопросе, где это уже решено:
Это делает именно это: получение строки «полных слов» с помощью регулярного выражения. Единственное отличие состоит в том, что оно удаляет последнее слово (а не расширяет его). Поскольку вы хотите расширить последнее слово, для этого требуется другой шаблон регулярного выражения.
В регулярном выражении \b
соответствует границе слова. Это до или после слова. Теперь вы хотите выбрать как минимум $length
символов до следующей границы слова.
Поскольку это может содержать пробелы перед следующим словом, вы можете обрезать результат, чтобы удалить эти пробелы в конце.
Вы можете расширить свою функцию следующим образом, используя шаблон регулярного выражения (preg_replace
) и trim
:
/**
* Cut a string at length while preserving the last word.
*
* @param string $str
* @param int $length
* @param string $suffix (optional)
*/
function trim_word($str, $length, $suffix = '...')
{
$len = strlen($str);
if ($len < $length) return $str;
$pattern = sprintf('/^(.{%d,}?)\b.*$/', $length);
$str = preg_replace($pattern, '$1', $str);
$str = trim($str);
$str .= $suffix;
return $str;
}
Использование:
$str = 'How are you today?';
echo trim_word($str, 10); # How are you...
В дальнейшем вы можете расширить это, уменьшив минимальную длину в шаблоне на длину суффикса (как это было предложено в вашем вопросе, однако результаты, которые вы дали в своем вопросе, не совпадали с вашим кодом).
Надеюсь, это полезно. Также, пожалуйста, используйте функцию поиска на этом сайте, она не идеальна, но многие драгоценные камни скрыты в существующих вопросах для альтернативных подходов.