我正在写博客,我需要一个显示帖子摘录的函数。我现在使用子字符串检查文本是否超过 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;
}
它工作得很好。只是有时没有达到重点(当有一个长链接时),但它可以没问题。现在,正如您从我尝试替换的函数中看到的那样\n
,<br>
as 是我真正想要的唯一标签,但它不起作用。知道为什么吗?