PHP — использование предложения Substr для обрезки

Вот мой код, что я делаю, так это извлекаю текст из базы данных, отображаю в таблице, и где данные превышают, скажем, 450 символов, я помещаю это в конец

....[подробнее]

Теперь код работает нормально, но есть одно исключение: информация в базе данных содержит html, например абзацы и маркированные списки. Это создает проблему, вся идея ограничения заключается в том, чтобы он не растягивал строку дальше, чем я хочу, разрыв строки для маркированного списка или абзаца, кажется, считается как 0 или 1 символ, но это занимает пространство для большого количества символов, так как я могу манипулировать этим кодом, чтобы учитывались разрывы строк.

Мои идеи состоят в том, чтобы подсчитать пробелы между ними примерно так:

$white_space = substr_count($text, ' ');

Что возвращает общее количество пробелов

Я также пробовал это

$white_space_str = substr_count($newstr, ' ');

Но это возвращает 0, поэтому я делаю что-то не так. Но в любом случае я немного застрял на этом этапе и надеюсь, что кто-то может помочь новичку, если код будет упрощен, а не обрезан и аккуратен, это может помочь мне лучше понять его :)

Но я не уверен, как поместить это в рабочий код.

function trim_description($str, $maxlen) {
if ( strlen($str) <= $maxlen ) return $str;

$newstr = substr($str, 0, $maxlen);
if ( substr($newstr,-1,1) != ' ' ) $newstr = substr($newstr, 0, strrpos($newstr, " "));

return $newstr;
}

person user1547410    schedule 06.08.2012    source источник
comment
Как насчет того, чтобы напечатать весь код в div фиксированного размера и со скрытым переполнением, а затем добавить ....[view more] в другой div рядом с ним? Таким образом, вам не нужно будет обрезать ни текст, ни html :) Просто идея, хотя :)   -  person Andrius Naruševičius    schedule 06.08.2012
comment
Фреймворк CakePHP уже это реализовал. Вы можете просто взять его оттуда: api.cakephp.org/class/string#method- Stringtruncate Источник: api.cakephp.org/view_source/string#line-439   -  person tigrang    schedule 06.08.2012
comment
что касается всего кода в div, я вроде как понимаю, о чем вы говорите, не могли бы вы привести мне быстрый пример, чтобы я мог разобраться в этом, или сказать мне ключевые слова, чтобы я мог искать другие примеры?   -  person user1547410    schedule 06.08.2012


Ответы (1)


Может быть, это может помочь вам. Я нашел это как ответ на этот вопрос

function truncate($text, $length, $suffix = '&hellip;', $isHTML = true) { 
    $i = 0; 
    $simpleTags=array('br'=>true,'hr'=>true,'input'=>true,'image'=>true,'link'=>true,'meta'=>true); 
    $tags = array(); 
    if($isHTML){ 
        preg_match_all('/<[^>]+>([^<]*)/', $text, $m, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); 
        foreach($m as $o){ 
            if($o[0][1] - $i >= $length) 
                break; 
            $t = substr(strtok($o[0][0], " \t\n\r\0\x0B>"), 1); 
            // test if the tag is unpaired, then we mustn't save them 
            if($t[0] != '/' && (!isset($simpleTags[$t]))) 
                $tags[] = $t; 
            elseif(end($tags) == substr($t, 1)) 
                array_pop($tags); 
            $i += $o[1][1] - $o[0][1]; 
        } 
    } 

    // output without closing tags 
    $output = substr($text, 0, $length = min(strlen($text),  $length + $i)); 
    // closing tags 
    $output2 = (count($tags = array_reverse($tags)) ? '</' . implode('></', $tags) . '>' : ''); 

    // Find last space or HTML tag (solving problem with last space in HTML tag eg. <span class="new">) 
    $pos = (int)end(end(preg_split('/<.*>| /', $output, -1, PREG_SPLIT_OFFSET_CAPTURE))); 
    // Append closing tags to output 
    $output.=$output2; 

    // Get everything until last space 
    $one = substr($output, 0, $pos); 
    // Get the rest 
    $two = substr($output, $pos, (strlen($output) - $pos)); 
    // Extract all tags from the last bit 
    preg_match_all('/<(.*?)>/s', $two, $tags); 
    // Add suffix if needed 
    if (strlen($text) > $length) { $one .= $suffix; } 
    // Re-attach tags 
    $output = $one . implode($tags[0]); 

    //added to remove  unnecessary closure 
    $output = str_replace('</!-->','',$output);  

    return $output; 
} 
person Mihai Matei    schedule 06.08.2012