ブログを書いていて、投稿の抜粋を表示する機能が必要です。テキストが 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>
のは、実際に必要な唯一のタグですが、機能しません。理由について何か考えはありますか?