Ограничьте текст определенным количеством символов, но остановитесь, когда в последних 20 символах будет найден период

Итак, у меня есть эта функция для создания выдержки из больших текстов.

function excerpt( $string, $max_chars = 160, $more = '...' ) {

if ( strlen( $string ) > $max_chars ) {

$cut = substr( $string, 0, $max_chars );

$string = substr( $cut, 0, strrpos( $cut, ' ' ) ) . $more;

}

return $string;
}

Это прекрасно работает, поскольку оно предназначено — оно ограничивает заданный текст определенным количеством символов, не сокращая слова.

Вот рабочий пример:

$str = "The best things in using PHP are that it is extremely simple for a newcomer, but offers many advanced features for a professional programmer. Don't be afraid reading the long list of PHP's features. You can jump in, in a short time, and start writing simple scripts in a few hours.";

echo excerpt( $str, 160 );

Это производит этот вывод:

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

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

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

Есть идеи, как архивировать это?

1

Решение

Я бы попробовал следующее и поместил это в цикл для всех ваших:

// Define the characters to look for:
$charToCheck = array(".", "!", "?");

// Loop through each character to check
foreach ( $charToCheck as $char) {

// Gives you the last index of a period. Returns false if not in string
$lastIndex = strrpos($cut, $char);

// Checks if character is found in the last 20 characters of your string
if ( $lastIndex > ($max_chars - 20)) {
// Returns the shortened string beginning from first character
$cut = substr($cut, 0, $lastIndex + 1);
}
}
1

Другие решения

Тот же подход, что и в ответе Fuzzzel, но выходит из цикла, возвращающего substr (без ‘…’) при первом совпадении.

function excerpt( $string, $max_chars = 160, $more = '...' ) {

$punct = array('.', '!', '?');  // array of punctuation chars to stop on

if ( strlen( $string ) > $max_chars ) {

$cut = substr( $string, 0, $max_chars );

$string = substr( $cut, 0, strrpos( $cut, ' ' ) );

foreach( $punct as $stop ){
$stop_pos = stripos( $string, $stop, $max_chars - 20 );
if( $stop_pos !== false){
return substr( $string, 0, $stop_pos + 1);
}
}
}

return $string . $more;
}

$str = "The best things in using PHP are that it is extremely simple for a newcomer, but offers many advanced features for a professional programmer! Don't be afraid reading the long list of PHP's features. You can jump in, in a short time, and start writing simple scripts in a few hours.";

echo excerpt( $str, 160 );
2

По вопросам рекламы [email protected]