0

ブログを書いていて、投稿の抜粋を表示する機能が必要です。テキストが 503 文字より長い場合、部分文字列チェックを使用しています。

しかし、これにより、テキストが単語の途中と HTML タグの途中でカットされることが多いため、ページの残りの部分が半分書かれたタグのようになります。

すなわち: "text text text <strong>Another piece of te [...]そしてページの残りの部分は、新しいストロング エンド タグに到達するまでストロングです。

投稿からいくつかの要素を削除しようとしましたが、テキストの書式が解除されました。

「わかりました。テキストは 980 文字です。最後のドット (.) に到達するため、またはタグを完成させるために必要なものはすべて 503 + でカットしてください。

私の現在のコードに従います:

<?php
  $testo_preview = preg_replace("/<img[^>]+\>/i", ' ', $valore->testo);
  $testo_preview = preg_replace("/<a[^>]+>/i", '<a>', $testo_preview);
  $testo_preview = preg_replace("/<span[^>]+>/i", '<span>', $testo_preview);
  $testo_preview = preg_replace("/<div[^>]+>/i", '', $testo_preview);
  $testo_preview = str_replace("</div>", '', $testo_preview);
  $testo_preview = str_replace("\n", '<br>', $testo_preview); 
?>

<?php if(strlen($testo_preview) >= 503): ?>

   <?= substr($testo_preview, 0, 503).' [...]' ?>

<?php else: ?>

   <?= $testo_preview; ?>

<?php endif; ?>

編集

Pawelの回答は、実際に「要点をつかむ」ため、問題なく機能していることがわかりました...

新しい DOMDocument() 部分は、html のアクセントを台無しにしていたため、変更する必要がありました (イタリア語ではいくつかのアクセントを使用しており、そのままにしておく必要がありました)。Tigger のコードの一部を使用して関数に変換したので、両方に賛成票を投じました。簡単な関数を思いつきました:

function cleanCut($cutAt, $str){
        $next_dot = strpos($str, '.', $cutAt);
        if ($next_dot !== false){
            // text after default cutoff contains a dot so we need to extend the cutoff
            $preview_text = substr($str, 0, $next_dot + 1);
            // HTML Cleanup
            $preview_text = strip_tags($preview_text);
            $preview_text = str_replace("\n", '<br>', $preview_text);           
        } else {
            $preview_text = $str;
        }

        return $preview_text;
    }

それはうまく機能します。(長いリンクがある場合) 要点に到達しない場合もありますが、問題ない場合があります。関数からわかるように、 as に置き換えようとし\n<br>のは、実際に必要な唯一のタグですが、機能しません。理由について何か考えはありますか?

4

2 に答える 2

1

私が間違っていなければ、タグをしばらく無視してください。必要な最後のピリオドを見つけて、開いているタグをクリーンアップします。1. 503 文字の後のドットの位置を見つけます。何も見つからない場合は、テキスト全体を表示します。それ以外の場合は、その時点までの部分文字列を表示します。strpos へのオフセットを使用します。2. HTML をクリーンアップして、開いているタグをすべて閉じます。3. DOMDocument は完全な html ドキュメントを出力するため、余分な部分を削除する必要があります。

例:

$max_length = 16;
$full_text  = "<b>Lorem ****. Impsum ****. That's already too long.</b>";
$next_dot   = strpos($full_text, '.', $max_length);

if ($next_dot !== false)
{
    // text after default cutoff contains a dot so we need to extend the cutoff
    $preview_text = substr($full_text, 0, $next_dot + 1); +1 so that the last dot is in
    // HTML Cleanup
    $doc = new DOMDocument();
    $doc->loadHTML("$preview_text");
    $preview_text = $doc->saveHTML();
    $preview_text = preg_replace('/(.*)<body>|(<\/body>.*)/ism', '', $preview_text);
} else {
    $preview_text = $full_text;
}

echo $preview_text;

少し素朴で、明らかな問題はほとんどありませんが、. それで十分か、b。自分で改善できるようになります。ああ、それから c. あなたはもっと質問します:)

于 2013-08-08T01:26:38.763 に答える
1

この関数は、特定のポイントまたはその直後で文字列をきれいにカットし、すべての HTML タグも削除します。は&#8230;、単一文字としての「...」の HTML コードです。

// strips HTML tags and return a clean word cut at a certain point
// or just after it.
function cleanCut($cutAt, $str) {
    $tmp = strip_tags($str);
    $tmp = explode(' ',$tmp);
    foreach($tmp as $k => $v) {
        $cleanStr .= $v.' ';
        if (strlen($cleanStr) >= $cutAt) {
            return trim($cleanStr).'&#8230;';
        }
    }
    // and it case it is a short string
    return $cleanStr;
}
于 2013-08-08T02:02:24.290 に答える