Если у меня есть строка в PHP, которая является ненавязчиво длинной строкой в PHP, и я хочу ее укоротить, а затем добавить что-то к ней.
Я хочу сократить его до первых 6 слов или 42 символов, что бы ни было короче, а затем добавить к нему «…», если он был сокращен.
Единственный случай, который он не укоротил бы, и «…» не добавил бы, если бы это было первоначально менее 6 слов или 42 символа.
Как я могу это сделать в PHP?
Логично, я бы подумал, что я разделил бы строку на белое пространство, а затем добавлю каждую вещь перед белым пространством в массив и выберем только первые 6 элементов из этого массива и напишу их в новую строку.
Вот код, который у меня есть до сих пор:
str_1 = 'The quick brown fox jumped over the lazy dog'; $words = explode(" ", $str_1); $counter = 0; str_2 = ''; foreach($words as $word){ if($counter < 5){ //append $words[counter] to str_2; counter++; } else{ break; } }
Я не знаю, как сделать остаток для подсчета символов или сравнения или добавления.
У кого-нибудь есть идеи?
Эта функция, которую я сделал, выглядит довольно аккуратно:
function truncate($input, $maxWords, $maxChars) { $words = preg_split('/\s+/', $input); $words = array_slice($words, 0, $maxWords); $words = array_reverse($words); $chars = 0; $truncated = array(); while(count($words) > 0) { $fragment = trim(array_pop($words)); $chars += strlen($fragment); if($chars > $maxChars) break; $truncated[] = $fragment; } $result = implode($truncated, ' '); if ($input == $result) { return $input; } else { return preg_replace('/[^\w]$/', '', $result) . '...'; } }
Некоторые тесты:
$str = 'The quick brown fox jumped over the lazy dog'; echo truncate($str, 5, 42); // The quick brown fox jumped... echo truncate($str, 3, 42); // The quick brown... echo truncate($str, 50, 30); // The quick brown fox jumped over the... echo truncate($str, 50, 100); // The quick brown fox jumped over the lazy dog
Он не будет вырезать слова пополам, так что, если слово подталкивает счетчик символов по прилагаемому лимиту, оно будет проигнорировано.
считать слова (подразумевает пробелы в пробелах):
$words = explode(' ', $string); $wordCount = count($words );
количество символов
$length = strlen($string);
вместе
if($wordCount > 5) { $words = array_slice($words, 0, 5); $string = implode(' ', $words); $length = strlen($string); } if($length > 42) { $string = substr($string , 0, 42); }
Это даст вам первые 6 слов или первые n слов, где общая длина слов меньше 42.
$words = explode(' ', $string); $newstring = ""; $i=0; while (strlen($newstring . $words[$i]) <= 42) && $i < 5) { $newstring .= $words[$i]; } if (strlen($string) > strlen($newstring)) $newstring .= "...";
$string = "Your Text Here"; $string_length = 80; // give a random character value including whitespace. if(strlen($string)>$string_length){ do{ $new_string = substr($string,0,$string_length); $string_length++; }while(ctype_graph(substr($new_string,-1))); } else { $new_string = $string; } echo $new_string;
в$string = "Your Text Here"; $string_length = 80; // give a random character value including whitespace. if(strlen($string)>$string_length){ do{ $new_string = substr($string,0,$string_length); $string_length++; }while(ctype_graph(substr($new_string,-1))); } else { $new_string = $string; } echo $new_string;