Вот что я пытаюсь сделать. У меня есть блок текста, и я хотел бы извлечь первые 50 слов из строки, не отрезая слова в середине. Вот почему я предпочел бы слова, противоположные символам, тогда я мог бы просто использовать функцию left ().
Я знаю, что функция str_word_count ($ var) вернет число слов в строке, но как я могу вернуть только первые 50 слов?
Я полностью погружаюсь в PHP, но пока не знаю многих строковых функций.
Спасибо заранее, Джейсон
Я бы рекомендовал не использовать количество слов в качестве базовой линии. Вы можете легко получить гораздо меньше или намного больше данных, чем вы планировали отображать.
Один из подходов, который я использовал в прошлом, – это запросить требуемую длину, но убедитесь, что он не усекает слово. Вот что-то, что может сработать для вас:
function function_that_shortens_text_but_doesnt_cutoff_words($text, $length) { if(strlen($text) > $length) { $text = substr($text, 0, strpos($text, ' ', $length)); } return $text; }
Тем не менее, если вы передадите 1
в качестве второго параметра str_word_count
, он вернет массив, содержащий все слова, и вы можете использовать манипуляции с массивами. Кроме того, вы могли бы, хотя, это немного взломать, взорвать строку в пробелах и т. Д. Но это вводит много места для ошибок, таких как вещи, которые не являются словами, считающимися словами.
PS. Если вам нужна безопасная версия Unicode для вышеуказанной функции и установлены либо mbstring
либо iconv
, просто замените все строковые функции на их mb_
или iconv_
префиксом.
str_word_count принимает необязательный параметр, который сообщает ему, что возвращать.
Возвращает массив строк, которые являются словами:
$words = str_word_count($var, 1);
Затем вы можете нарезать что-то вроде:
$len = min(50, count($words)); $first_fifty = array_slice($words, 0, $len);
Вы уверены, что хотите определенное количество слов? Если вы делаете что-то вроде «предварительного просмотра», обычно лучше делать что-то вроде «До 300 символов, обрезанных на границе слова», и в этом случае вы можете использовать что-то вроде:
if (strlen($str)>300) { $str = substr($str,0,300); $pos = strrpos($str, ' '); if ($pos !== false && $pos > 200) // If there is no space in the last 100 chars, just truncate $str = substr($str,0,$pos); // You may also want to add ellipses: // $str .= '...'; }
Я нашел более простой способ сделать это:
function get_len_of_word($str,$number) { $array_str = explode(" ", $str); if(isset($array_str[$number])) { return implode(" ",array_slice($array_str, 0, $number)); } return $str; }
Вот еще один пример,
function getWordsFromString($str,$word_count) { $new_str=$str; $_strArr=explode(" ",$str); $_tempArr=array(); if(count($_strArr)>$word_count) { foreach ($_strArr as $key=> $value) { $_tempArr[]=$value; if($key==$word_count-1) { $new_str=implode(" ",$_tempArr).' ...'; } } } return $new_str; }
function get_first_num_of_words($string, $num_of_words) { $string = preg_replace('/\s+/', ' ', trim($string)); $words = explode(" ", $string); // an array // if number of words you want to get is greater than number of words in the string if ($num_of_words > count($words)) { // then use number of words in the string $num_of_words = count($words); } $new_string = ""; for ($i = 0; $i < $num_of_words; $i++) { $new_string .= $words[$i] . " "; } return trim($new_string); }
Используйте его так:
echo get_first_num_of_words("Lorem ipsum dolor sit amet consectetur adipisicing elit. Aliquid, illo?", 5);
Выход: Lorem ipsum dolor sit amet
Эта функция также отлично работает с символами юникода, такими как арабские символы.
echo get_first_num_of_words("نموذج لنص عربي الغرض منه توضيح كيف يمكن استخلاص أول عدد معين من الكلمات الموجودة فى نص معين.", 100);
Выход: نموذج لنص عربي الغرض منه توضيح كيف يمكن استخلاص أول عدد معين من الكلمات الموجودة فى نص معين.