Простое разбиение по пробелам будет работать некорректно, если в структуре предложения есть неожиданный символ вместо пробела или если предложение содержит несколько соединенных пробелов.
Следующая версия будет работать независимо от того, какой «пробел» вы используете между словами и может быть легко расширена для обработки других символов ... в настоящее время она поддерживает любые пробелы плюс,. ; ? !
function get_snippet( $str, $wordCount = 10 ) {
return implode(
'',
array_slice(
preg_split(
'/([\s,\.;\?\!]+)/',
$str,
$wordCount*2+1,
PREG_SPLIT_DELIM_CAPTURE
),
0,
$wordCount*2-1
)
);
}
Регулярные выражения идеально подходят для этой проблемы, потому что вы можете легко сделать код настолько гибким или строгим, насколько захотите Вы должны быть осторожны, однако. Я специально подошел к вышесказанному, ориентируясь на пробелы между словами & mdash; а не сами слова & mdash; потому что довольно сложно однозначно определить, что будет определять слово.
Возьмите \w
границу слова или ее обратную \W
. Я редко на них полагаюсь, в основном потому, что & mdash; в зависимости от используемого вами программного обеспечения (например, определенных версий PHP) & mdash; они не всегда включают символы UTF-8 или Unicode .
В регулярных выражениях лучше всегда быть конкретным. Так что ваши выражения могут обрабатывать такие вещи, как следующие, независимо от того, где они отображаются:
echo get_snippet('Это не те дроиды, которые вы ищете', 5);
/// outputs: Это не те дроиды, которые
Однако, с точки зрения производительности, стоит избегать расщепления. Таким образом, вы можете использовать обновленный подход Келли, но переключите \w
для [^\s,\.;\?\!]+
и \W
для [\s,\.;\?\!]+
. Хотя лично мне нравится простота выражения разделения, использованного выше, его легче читать и, следовательно, изменять. Однако стек функций PHP немного уродлив:)