Привет, у меня есть собственный текст внутри переменной:
$myvar = 'this is my custom text, it is a very long text so be patiente, take care!";
Мне нужно показать, что можно сказать первые 100 символов из $ myvar, но мне нужны полные слова. Например: это мой пользовательский текст, это ver … (я не хочу вырезать слова, когда я извлекаю)
Как я могу это сделать?
Спасибо!
Есть куча путей, но попробуйте это:
$shortVersion = substr($myvar, 0, 100); if(strlen($myvar)>100 && preg_match('`\w`', $myvar{100})) $shortVersion = preg_replace('`\w+$`', '', $shortVersion);
Вероятно, это ваш путь наименьшего сопротивления.
В комментариях пользователя о функции substr () есть несколько примеров этого
Один из самых простых:
function wrapTrunc($str, $len) { return substr(($str=wordwrap($myvar,$len,'$$')),0,strpos($str,'$$')); }
Основным недостатком этого wordwrap
основанного на wordwrap
является то, что вы тратите время и память на всю цепочку, хотя вам нужно сохранить только первые $len
символы.
Вот решение на основе регулярных выражений, которое я только что взломал, что мне немного удобнее:
<?php $myvar = 'this is my custom text, it is a very long text so be patiente, take care!'; var_dump(trunc($myvar, 50)); function trunc($str, $len = 50) { return preg_replace("/^(.{1,$len}\S)\b.*/", '$1', $str); }
Пример вывода:
$ php test.php string(49) "this is my custom text, it is a very long text so"
Ну … Поскольку мы вводим код, мои 2 цента:
<?php function noWordCut($str, $len, $before=true, $add=' ...', $punctuation=array(' ',',','.','!','?',';')){ if(!isset($str[$len]))return $str; if(in_array($str[$len], $punctuation))return substr($str, 0, $len).$add; $dir=($before)?-1:1; for(;$len+=$dir;) if(in_array($str[$len], $punctuation)) return substr($str, 0, $len).$add; return $str;// one big chunk of word? } ?>
Угадай, что. Для этого есть встроенная функция PHP 🙂
print wordwrap($text, 100);
Ooops, для разрезания первой линии вы можете использовать:
$first = strtok(wordwrap($text, 100), "\n");
Вот плохой пример, который, вероятно, тратит много времени на обработку и память:
<?php $text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin congue, quam nec tincidunt congue, massa ipsum sodales tellus, in rhoncus sem quam quis ante. Nam condimentum pellentesque libero at blandit."; $length = 100; $words = explode(' ', $text); for ($x=0; $x <= count($words); $x++) { $output = implode(' ', array_slice($words, 0, $x)); if (strlen($output) >= $length) { echo $output . '...'; break; } } ?>
Зачем? Потому что я могу.