我有以下代码输出从我的数据库中检索的一些文本:
<p><?php echo nl2br(bb_code($bodytext)); ?></p>
Run Code Online (Sandbox Code Playgroud)
我想要做的是添加一个"预览",其中只显示前250个字符左右,然后用户可以点击链接阅读整个内容.像这样的东西:
<p><?php echo nl2br(bb_code(substr($bodytext, 0, 250))); ?>...<br />
<a href="#">Continue reading</a></p>
Run Code Online (Sandbox Code Playgroud)
这里显然有几个问题.
[url=http://www..example.com]link[/url]当它应被解释为4时将被解释为39个字符.我怎么能做到这一点?
当使用bbCode Playground进行测试时,我注意到 bbCode 似乎不允许转义,并且只要它与任何特定的代码和格式不匹配,就会返回括号内的文本。您面临着用通用方法错误地替换括号中的文本的风险。
以下代码将替换 bbCode,查找特定标签。它不检查属性,仅检查标签是否允许属性。此外,它仍然会错误地匹配 bbCode 不会返回的内容,例如[b]asdasd[b]asdsda[/b]dasd[/b]bbCode 将返回asdasd[b]asdsdadasd[/b]和 this 将返回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>
Run Code Online (Sandbox Code Playgroud)
我注意到在另一个答案中他们正在寻找感叹号。我不知道bbCode中那些的意义。'/\[[\/!]?...如果它很重要,您可以将其添加到开头。
下面的小提琴展示了它如何与一些示例文本一起使用。