substr剪切文本句末而不是单词结尾

时间:2013-06-12 14:36:48

标签: php regex substring truncate

我有一个工作代码来切断单词末尾的文本,但我正在寻找一个句子的结尾,所以寻找一个。(句号)(空格)而不仅仅是一个空格。我还需要保留文本的html格式,以便它们也可以是几个列表项。

截断字的代码:

$description_excerpt = preg_replace('/\s+?(\S+)?$/', '', substr($description_excerpt, 0, 200));
echo $description_excerpt;

假设$ description_excerpt等于:

<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>

<ul>
    <li>One. </li>
    <li>two. </li>
</ul>
<p>More text... </p>

然后当它通过截断器运行时,它将返回:

<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>

<ul>
    <li>One</li>
<ul>

1 个答案:

答案 0 :(得分:0)

缩短HTML文字并非如此简单。当然希望有文本的实际长度,而不是带有HTML标签的文本。在您的示例中,25个字符占用<p> <ul> <li>。但是让我们把它留在最后。

最佳解决方案是两阶段操作。查找'. '和2:关闭标记。

$description_excerpt = preg_replace('/(\.)\s+[^\.]*$/', '\1', 
                                    substr($description_excerpt, 0, 200));

preg_match_all('/<(?P<close>\/)?(?P<tag>\w+)(?P<atr>[^>]*)>/', 
               $description_excerpt, $m, PREG_SET_ORDER);
print_r($m);

现在您只需要查看哪些标签需要关闭。我建议使用array_shiftarray_unshift排队。 (并记住,不需要关闭的标签)

如果您希望更接近文本的确切长度,首先将文本划分为多个部分:文本和HTML标记。然后确保您可以扩展内容的次数越多。如果没有,请关闭标签。