Как обрезать строку в PHP до слова, ближайшего к определенному количеству символов? - PullRequest
171 голосов
/ 17 сентября 2008

У меня есть фрагмент кода, написанный на PHP, который извлекает блок текста из базы данных и отправляет его виджету на веб-странице. Оригинальный блок текста может быть длинной статьей или коротким предложением или двумя; но для этого виджета я не могу отобразить больше, скажем, 200 символов. Я мог бы использовать substr (), чтобы обрезать текст на 200 символов, но результат был бы обрезан в середине слова - что я действительно хочу - обрезать текст в конце последнего слова до 200 символов.

Ответы [ 26 ]

2 голосов
/ 17 сентября 2008

Я бы использовал для этого функцию preg_match, поскольку вы хотите получить довольно простое выражение.

$matches = array();
$result = preg_match("/^(.{1,199})[\s]/i", $text, $matches);

Выражение означает «соответствует любой подстроке, начиная с начала длины 1-200, заканчивающейся пробелом». Результат в $ результате, а совпадение в $ совпадений. Это заботится о вашем первоначальном вопросе, который конкретно заканчивается в любом месте. Если вы хотите, чтобы это заканчивалось на новых строках, измените регулярное выражение на:

$result = preg_match("/^(.{1,199})[\n]/i", $text, $matches);
2 голосов
/ 05 апреля 2012
/*
Cut the string without breaking any words, UTF-8 aware 
* param string $str The text string to split
* param integer $start The start position, defaults to 0
* param integer $words The number of words to extract, defaults to 15
*/
function wordCutString($str, $start = 0, $words = 15 ) {
    $arr = preg_split("/[\s]+/",  $str, $words+1);
    $arr = array_slice($arr, $start, $words);
    return join(' ', $arr);
}

Использование:

$input = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna liqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.';
echo wordCutString($input, 0, 10); 

Это выведет первые 10 слов.

Функция preg_split используется для разбиения строки на подстроки. Границы, вдоль которых должна разбиваться строка, задаются с помощью шаблона регулярных выражений.

preg_split функция принимает 4 параметра, но только первые 3 относятся к нам прямо сейчас.

Первый параметр - Шаблон Первый параметр - это шаблон регулярных выражений, по которому нужно разбить строку. В нашем случае мы хотим разбить строку по границам слова. Поэтому мы используем предопределенный класс символов \s, который соответствует символам пробела, таким как пробел, табуляция, возврат каретки и перевод строки.

Второй параметр - строка ввода Второй параметр - это длинная текстовая строка, которую мы хотим разделить.

Третий параметр - предел Третий параметр указывает количество подстрок, которые должны быть возвращены. Если вы установите ограничение n, preg_split вернет массив из n элементов. Первые элементы n-1 будут содержать подстроки. Последний элемент (n th) будет содержать остаток строки.

2 голосов
/ 26 октября 2011

Хорошо, поэтому я получил другую версию этого, основанную на ответах выше, но принимая во внимание больше вещей (utf-8, \ n и & nbsp;), а также строку, зачеркивающую шорткоды wordpress, прокомментированные, если используется с wp.

function neatest_trim($content, $chars) 
  if (strlen($content) > $chars) 
  {
    $content = str_replace(' ', ' ', $content);
    $content = str_replace("\n", '', $content);
    // use with wordpress    
    //$content = strip_tags(strip_shortcodes(trim($content)));
    $content = strip_tags(trim($content));
    $content = preg_replace('/\s+?(\S+)?$/', '', mb_substr($content, 0, $chars));

    $content = trim($content) . '...';
    return $content;
  }
1 голос
/ 11 декабря 2014

Вот как я это сделал:

$string = "I appreciate your service & idea to provide the branded toys at a fair rent price. This is really a wonderful to watch the kid not just playing with variety of toys but learning faster compare to the other kids who are not using the BooksandBeyond service. We wish you all the best";

print_r(substr($string, 0, strpos(wordwrap($string, 250), "\n")));
1 голос
/ 13 июня 2014

У меня есть функция, которая делает почти то, что вы хотите, если вы сделаете несколько правок, она точно подойдет:

<?php
function stripByWords($string,$length,$delimiter = '<br>') {
    $words_array = explode(" ",$string);
    $strlen = 0;
    $return = '';
    foreach($words_array as $word) {
        $strlen += mb_strlen($word,'utf8');
        $return .= $word." ";
        if($strlen >= $length) {
            $strlen = 0;
            $return .= $delimiter;
        }
    }
    return $return;
}
?>
1 голос
/ 09 декабря 2010

На основе регулярного выражения @Justin Poliey:

// Trim very long text to 120 characters. Add an ellipsis if the text is trimmed.
if(strlen($very_long_text) > 120) {
  $matches = array();
  preg_match("/^(.{1,120})[\s]/i", $very_long_text, $matches);
  $trimmed_text = $matches[0]. '...';
}
1 голос
/ 10 ноября 2011

Это небольшое исправление для ответа Мэтмака:

preg_replace('/\s+?(\S+)?$/', '', substr($string . ' ', 0, 201));

Единственное отличие - добавить пробел в конце строки $. Это гарантирует, что последнее слово не обрезается согласно комментарию ReX357.

Мне не хватает точек репутации, чтобы добавить это в качестве комментария.

0 голосов
/ 26 августа 2015

Здесь вы можете попробовать это

substr( $str, 0, strpos($str, ' ', 200) ); 
0 голосов
/ 24 июня 2015

Я создаю функцию, более похожую на substr, и использую идею @ Dave.

function substr_full_word($str, $start, $end){
    $pos_ini = ($start == 0) ? $start : stripos(substr($str, $start, $end), ' ') + $start;
    if(strlen($str) > $end){ $pos_end = strrpos(substr($str, 0, ($end + 1)), ' '); } // IF STRING SIZE IS LESSER THAN END
    if(empty($pos_end)){ $pos_end = $end; } // FALLBACK
    return substr($str, $pos_ini, $pos_end);
}

Ps .: полный отрезок может быть меньше, чем субстрат.

0 голосов
/ 11 мая 2018

Я нахожу это работает:

функция abbreviate_string_to_whole_word ($ строка, $ max_length, $ буфер) {

if (strlen($string)>$max_length) {
    $string_cropped=substr($string,0,$max_length-$buffer);
    $last_space=strrpos($string_cropped, " ");
    if ($last_space>0) {
        $string_cropped=substr($string_cropped,0,$last_space);
    }
    $abbreviated_string=$string_cropped."&nbsp;...";
}
else {
    $abbreviated_string=$string;
}

return $abbreviated_string;

}

Буфер позволяет вам настроить длину возвращаемой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...