0

これが私のコードです。データベースからテキストを取得し、テーブルに表示し、データが450文字を超えているとしましょう。これを最後に置きます

....[もっと見る]

これでコードは問題なく動作しますが、例外が 1 つあります。データベース内の情報には、段落や箇条書きリストなどの 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;
}
4

1 に答える 1

0

多分これはあなたを助けることができます。私はこれをこの質問に対する答えとして見つけました

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; 
} 
于 2012-08-06T06:45:34.633 に答える