Я хочу усечь / сократить мою строку до предложения, ближайшего к цератенному числу символов.
У меня есть рабочая функция, но моя функция усекает слово, наиболее близкое к числу символов certaion.
function shortenString($string, $your_desired_width) { $parts = preg_split('/([\s\n\r]+)/', $string, null, PREG_SPLIT_DELIM_CAPTURE); $parts_count = count($parts); $length = 0; $last_part = 0; for (; $last_part < $parts_count; ++$last_part) { $length += strlen($parts[$last_part]); if ($length > $your_desired_width) { break; } } return implode(array_slice($parts, 0, $last_part)); }
Например:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer malesuada eleifend orci, eget dignissim ligula porttitor cursus. Преданный в бледном enim. Мозаичная биографическая справка. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas pulvinar gravida tempor.
Следует сократить до:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer malesuada eleifend orci, eget dignissim ligula porttitor cursus.
Вместо того, чтобы нарушать предложение следующим образом:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer malesuada eleifend orci, eget dignissim ligula porttitor cursus. Предать в
Помощь приветствуется.
Это то, что я придумал … вы должны проверить, дольше ли предложение, чем то, что вы ищете .. среди прочего, что сказал g13n. Возможно, было бы лучше, если предложение слишком короткое / длинное, чтобы отрубить его и поставить «…». Кроме того, вам придется проверять / преобразовывать пробелы, поскольку strrpos будет искать только то, что дано.
$maxlen = 150; $file = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer malesuada eleifend orci, eget dignissim ligula porttitor cursus. Praesent in blandit enim. Maecenas vitae eleifend est. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas pulvinar gravida tempor."; if ( strlen($file) > $maxlen ){ $file = substr($file,0,strrpos($file,". ",$maxlen-strlen($file))+1); }
если вы хотите использовать ту же самую функцию, вы можете попробовать следующее:
function shortenString($string, $your_desired_width) { $parts = preg_split('/([\s\n\r]+)/', $string, null, PREG_SPLIT_DELIM_CAPTURE); $parts_count = count($parts); $length = 0; $last_part = 0; $last_taken = 0; foreach($parts as $part){ $length += strlen($part); if ( $length > $your_desired_width ){ break; } ++$last_part; if ( $part[strlen($part)-1] == '.' ){ $last_taken = $last_part; } } return implode(array_slice($parts, 0, $last_taken)); }
Вы могли бы просто использовать простое регулярное выражение, например /^([^.]*?).*/
и заменить его на «$ 1». Подобно:
$output = preg_replace('/^([^.]+).*/', '$1.', $input);
Тем не менее, вы должны знать, что не все языки имеют период (.) В качестве разделителя предложения.
НТН.
Я попробовал несколько функций и регулярных выражений, но ни один из них не работает так, как мне бы хотелось, поэтому я создаю этот:
function sentenceTrim($string, $maxLength = 300) { $string = preg_replace('/\s+/', ' ', trim($string)); // Replace new lines (optional) if (mb_strlen($string) >= $maxLength) { $string = mb_substr($string, 0, $maxLength); $puncs = array('. ', '! ', '? '); // Possible endings of sentence $maxPos = 0; foreach ($puncs as $punc) { $pos = mb_strrpos($string, $punc); if ($pos && $pos > $maxPos) { $maxPos = $pos; } } if ($maxPos) { return mb_substr($string, 0, $maxPos + 1); } return rtrim($string) . '…'; } else { return $string; } }
Он обрезает строку до указанной максимальной длины, находит последнее вхождение конца (. Или! Или?) Последнего предложения из этой строки и снова обрезает это событие. Он возвращает одно или несколько полных предложений как можно ближе к указанному числу символов.
Пожалуйста, исправьте мой английский.