9

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

<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)被计为预览长度的一部分,因此[url=http://www..example.com]link[/url]当它应该被解释为 4 时将被解释为 39 个字符。
  2. 如果文本被不匹配的 bb 代码标签截断,它们将不会被解析。

我怎样才能做到这一点?

4

2 回答 2

1

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

下面的代码将替换 bbCode,寻找特定的标签。它不检查属性,仅当标签是否允许属性时。此外,它仍然会错误地匹配 bbCode 不会返回的东西,例如[b]asdasd[b]asdsda[/b]dasd[/b]bbCode 将返回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

于 2013-07-28T23:03:26.623 回答
0

我会剥离 BB 代码,因为它是预览版。

<p><?php echo nl2br(substr(strip_tags(bb_code($bodytext)), 0, 250)); ?>...<br />
<a href="#">Continue reading</a></p>
于 2013-07-28T22:41:15.083 回答