我有一个功能可以清除表单中的输入和另一个解码它的函数。它有点像bbcode,当将其存储在数据库中时(使用<br />
函数)将换行转换为nl2br()
,然后将<br />
转换回换行符每当它被放回到&#34;编辑页面的字段中时#34;用户可以编辑帖子(using str_replace('<br />',"\n",$data))
。
问题在于,每次对帖子进行解码以进行编辑,然后再次编码进行存储时,每个<br />
会变成两个<br /><br />
。
\ n或\ r \ n是否等于两个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/
答案 0 :(得分:1)
nl2br - 在字符串中的所有换行符之前插入 HTML换行符
(强调我的)。
它不会替换换行符,只会插入换行符。因此,如果您尝试通过替换nl2br
来恢复<br />
,那么您将获得两个\n
,旧版本和替换<br />
时插入的版本。
最简单的解决方法是删除从\n
获取的字符串中的所有nl2br
,正确的方法是存储不带<br />
的文本,并在显示时进行转换。< / p>