如何创建预览文本

时间:2013-07-28 21:43:54

标签: php regex

我有以下代码用于输出从我的数据库中检索的一些文本:

<p><?php echo nl2br(bb_code($bodytext)); ?></p>

我想要做的是添加“预览”,其中只显示前250个字符左右,然后用户可以点击链接阅读整个内容。像这样:

<p><?php echo nl2br(bb_code(substr($bodytext, 0, 250))); ?>...<br />
<a href="#">Continue reading</a></p>

这里显然有几个问题。

  1. bb代码标记中的内容(例如网址)会计入预览长度的一部分,因此[url=http://www..example.com]link[/url]在被解释为4时将被解释为39个字符。
  2. 如果使用不匹配的bb代码标签切断文本,则不会对其进行解析。
  3. 我该如何做到这一点?

2 个答案:

答案 0 :(得分:1)

使用bbCode Playground进行测试时,我注意到bbCode似乎不允许转义,并且只要它与任何代码和格式都不匹配,就会返回括号内的文本。您可能会使用通用方法错误地替换括号中的文本。

以下代码将替换bbCode,查找特定标记。仅当标记允许属性时,它才会检查属性。此外,它仍然会错误地匹配bbCode不会的内容,例如bbCode中的[b]asdasd[b]asdsda[/b]dasd[/b]会返回asdasd[b]asdsdadasd[/b],这将返回asdasdasdsdadasd。如果你需要更准确的东西,你需要一个解析器。

<?php
function createPreview($text, $limit) {
    $text = preg_replace('/\[\/?(?:b|i|u|s|center|quote|url|ul|ol|list|li|\*|code|table|tr|th|td|youtube|gvideo|(?:(?:size|color|quote|name|url|img)[^\]]*))\]/', '', $text);

    if (strlen($text) > $limit) return substr($text, 0, $limit) . "...";
    return $text;
}
?>

<p><?php echo nl2br(createPreview($bodytext)); ?></p>

我注意到在另一个答案中他们正在寻找感叹号。我不知道那些在bbCode中的意义。如果它很重要,您可以在开始'/\[[\/!]?...添加它。

以下小提琴显示了它如何与一些示例文本一起使用。

phpFiddle

答案 1 :(得分:0)

我会删除BB代码,因为它是预览。

<p><?php echo nl2br(substr(strip_tags(bb_code($bodytext)), 0, 250)); ?>...<br />
<a href="#">Continue reading</a></p>