函数添加一个额外的换行符?

时间:2015-07-06 20:13:24

标签: php

我有一个功能可以清除表单中的输入和另一个解码它的函数。它有点像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/

1 个答案:

答案 0 :(得分:1)

来自documentation for nl2br

  

nl2br - 字符串中的所有换行符之前插入 HTML换行符

(强调我的)。

它不会替换换行符,只会插入换行符。因此,如果您尝试通过替换nl2br来恢复<br />,那么您将获得两个\n,旧版本和替换<br />时插入的版本。

最简单的解决方法是删除从\n获取的字符串中的所有nl2br,正确的方法是存储不带<br />的文本,并在显示时进行转换。< / p>