我做了大量的谷歌搜索,我似乎无法弄明白。希望你能帮助我。
我正在编写留言板。系统会根据回复过滤HTML,并强制我的成员使用标准BBcode。所有基本的BB代码都运行顺畅,但是我遇到了我的表格代码。
BBcode
这是控制留言板上BBcode的脚本。这非常简单直接。我只关心[table] [tr]和[td],但我包括[b],这样你就会明白该函数只处理我正在使用的三个代码。
function BBcode($original_string) {
$find = array(
'/\[b\](.*?)\[\/b\]/is',
'/\[table\](.*?)\[\/table\]/is',
'/\[tr\](.*?)\[\/tr\]/is',
'/\[td\](.*?)\[\/td\]/is'
);
$replace = array(
'<b>$1</b>',
'<table border="1" cellpadding="5">$1</table>',
'<tr>$1</tr>',
'<td>$1</td>
);
$new_string = preg_replace ($find, $replace, $original_string);
return $new_string;
}
因此,如果某个成员想在留言板上的响应中使用表BBcode代码,他们可能会输入这样的内容:
[table]
[tr]
[td]Cell 1[/td]
[td]Cell 2[/td]
[td]Cell 3[/td]
[/tr]
[tr]
[td]x[/td]
[td]y[/td]
[td]z[/td]
[/tr]
[/table]
哪个好极了!这按计划工作。
问题
虽然它有一个主要缺陷 - 如果一个成员使用上面提供的BBcode提交表格,nl2br会添加一大堆无用的空格。你可以在这里看到我的意思:
(想象一下每增加一个TR会有多糟糕)
但是,如果用户发布了这样的评论:
[table] [tr] [td]Cell 1[/td] [td]Cell 2[/td] [td]Cell 3[/td] [/tr] [tr] [td]x[/td] [td]y[/td] [td]z[/td] [/tr] [/table]
他们发布的评论看起来不错:
我已经尝试过的事情
我发现这种情况正在发生,因为我在这些评论中使用了nl2br。目前,它在BBcode功能运行之前添加了BR标签。我尝试在BBcode之后移动nl2br,但这不起作用。
接下来,我回到BBcode函数并尝试在数组中执行str_replace。
function BBcode($original_string) {
$find = array(
'/\[b\](.*?)\[\/b\]/is',
'/\[table\](.*?)\[\/table\]/is',
'/\[tr\](.*?)\[\/tr\]/is',
'/\[td\](.*?)\[\/td\]/is'
);
$replace = array(
'<b>$1</b>',
'<table border="1" cellpadding="5">' .print str_replace("<br />", "", "$1"). '</table>',
'<tr>$1</tr>',
'<td>$1</td>
);
$new_string = preg_replace ($find, $replace, $original_string);
return $new_string;
}
我还试图用无数其他方式写出这一行,例如:
'<table border="1" cellpadding="5">' .str_replace("<br />", "", "$1"). '</table>',
'<table border="1" cellpadding="5">' .str_replace("<br />", "", "$1"). '$1</table>',
'<table border="1" cellpadding="5">' .str_replace("<br />", "", "$1"). '$1</table>',
'<table border="1" cellpadding="5">' . $thing = str_replace("<br />", "", "$1"); . '$thing</table>',
'<table border="1" cellpadding="5">' . $thing = str_replace("<br />", "", "$1") . '$thing</table>',
'<table border="1" cellpadding="5">' . print str_replace("<br />", "", $1); . '</table>',
etc
基本上,我想要做的是替换[table]代码中找到的所有BR标签。我该怎么做呢?我究竟做错了什么?我应该改变方法吗?
如果这个问题已在其他地方得到解答,我提前道歉。我在其他论坛上看到至少有三个人有同样的问题,但是OP都链接到同一个地方 - 现在在过期链接上给出解决方案的线程。但如果我错过了什么,请链接我!如果您有任何疑问,请询问!
答案 0 :(得分:0)
我遇到此问题时所做的是隐藏br/
我将表格设置为自定义div
$replace = array(
'<div class="tablepost"><table border="1" cellpadding="5">' .print str_replace("<br />", "", "$1"). '</table></div>',
然后添加了这个css技巧:
.tablepost > br {
content: ' '
}