【发布时间】:2015-07-06 20:13:23
【问题描述】:
我有一个对表单输入进行清理的函数和另一个对其进行解码的函数。它有点像 bbcode,它在将换行符存储在数据库中时也将换行符转换为<br />(使用nl2br() 函数),然后在将<br /> 放回用于“编辑页面”,用户可以在其中编辑他们的帖子(using str_replace('<br />',"\n",$data))。
问题在于,每次对帖子进行解码以进行编辑然后再次编码以进行存储时,每个<br /> 都会变成两个<br /><br />。
\n 或 \r 是否等于两个 HTML 换行符?
这是两个函数的代码。
function sanitize2($data) {
$patterns = array();
$patterns[0] = '/</';
$patterns[1] = '/>/';
$data1 = preg_replace($patterns, "", $data);
$bopen = substr_count($data1, '[b]') + substr_count($data1, '[B]');
$bclosed = substr_count($data1, '[/b]') + substr_count($data1, '[/B]');
$iopen = substr_count($data1, '[i]') + substr_count($data1, '[I]');
$iclosed = substr_count($data1, '[/i]') + substr_count($data1, '[/I]');
$uopen = substr_count($data1, '[u]') + substr_count($data1, '[U]');
$uclosed = substr_count($data1, '[/u]') + substr_count($data1, '[/U]');
$bx = $bopen - $bclosed;
$ix = $iopen - $iclosed;
$ux = $uopen - $uclosed;
if ($bx > 0) {
for ($i = 0; $i < $bx; $i++) {
$data1 .= "[/b]";
}
}
if ($ix > 0) {
for ($i = 0; $i < $ix; $i++) {
$data1 .= "[/i]";
}
}
if ($ux > 0) {
for ($i = 0; $i < $ux; $i++) {
$data1 .= "[/u]";
}
}
$newer = sanitize($data1);
$search = array('[b]', '[/b]', '[i]', '[/i]', '[u]', '[/u]', '[B]', '[/B]', '[I]', '[/I]', '[U]', '[/U]');
$replace = array('<b>', '</b>', '<i>', '</i>', '<u>', '</u>', '<b>', '</b>', '<i>', '</i>', '<u>', '</u>');
$newest = str_replace($search, $replace, $newer );
$final = nl2br($newest);
return $final;
}
function decode($data) {
$new = str_replace('<br />',"\n",$data);
$search = array('[b]', '[/b]', '[i]', '[/i]', '[u]', '[/u]');
$replace = array('<b>', '</b>', '<i>', '</i>', '<u>', '</u>');
$newer = str_replace($replace, $search, $new );
return $newer;
}
更新:
我发现这个页面提供了一种解决方法。显然这是 nl2br() 函数的问题。 :-/
http://websolstore.com/how-to-use-nl2br-and-its-reverse-br2nl-in-php/
【问题讨论】:
-
应该用换行符存储,然后在需要显示时使用
nl2br。
标签: php