将 <br /> 转换为文本区域中的新行

55

如果我有一个变量:

$var1 = "Line 1 info blah blah <br /> Line 2 info blah blah";

还有一个文本区域:

<textarea>echo $var1</textarea>

我该如何让文本区域显示新的一行,而不是在其中添加<br />标签后只显示一行文本?

编辑:我尝试过以下方法:

<textarea class="hobbieTalk" id="hobbieTalk" name="hobbieTalk" cols="35" rows="5" onchange="contentHandler('userInterests',this.id,this.value,0)"><?php

$convert=$_SESSION["hobbieTalk"];
$convert = str_replace("<br />", "\n", $convert);
echo $convert;

?></textarea>

可是文本区域仍然包含了每行的 br 标签。


我发现这个答案很有用。似乎与上面的任何答案都不相符。 - digifrog
6个回答

104

试试这个

<?php
    $text = "Hello <br /> Hello again <br> Hello again again <br/> Goodbye <BR>";
    $breaks = array("<br />","<br>","<br/>");  
    $text = str_ireplace($breaks, "\r\n", $text);  
?>  
<textarea><?php echo $text; ?></textarea>

12
谢谢大家:请注意,如果您使用转换后的 HTML 标签将此字符串存储在数据库中,则必须输入以下内容:$breaks = array("<br />","<br>","<br/>","<br />","<br />","<br/>","<br>");。祝大家好运! - someguy
3
对我来说,$text = str_ireplace($breaks, "", $text); 的效果更好! :-) - bestprogrammerintheworld
@bestprogrammerintheworld 对于这个 $text = str_ireplace($breaks, "", $text); 你可以使用 strip_tags($text) - Naumov
@Naumov 这会从字符串中去除所有标签,而不仅仅是$breaks。 - Manuel
@ManuelDallaLana 在问题中写下你需要在<textarea><?php echo $var1 ?></textarea>中输出的字符串,这意味着他只需要文本而不需要HTML实体。 - Naumov
显示剩余2条评论

18

我使用以下结构将nl2br转换回来:

function br2nl( $input ) {
    return preg_replace('/<br\s?\/?>/ius', "\n", str_replace("\n","",str_replace("\r","", htmlspecialchars_decode($input))));
}

我在$input中替换了\n\r符号,因为nl2br不会移除它们,这会导致\n\n\r<br>的输出错误。


5

@Mobilpadde的答案很好。但是,这是我的解决方案,使用正则表达式和preg_replace函数,根据我的测试可能更快。

echo preg_replace('/<br\s?\/?>/i', "\r\n", "testing<br/><br /><BR><br>");

function function_one() {
    preg_replace('/<br\s?\/?>/i', "\r\n", "testing<br/><br /><BR><br>");
}

function function_two() {
    str_ireplace(['<br />','<br>','<br/>'], "\r\n", "testing<br/><br /><BR><br>");
}

function benchmark() {
    $count = 10000000;
    $before = microtime(true);

    for ($i=0 ; $i<$count; $i++) {
        function_one();
    }

    $after = microtime(true);
    echo ($after-$before)/$i . " sec/function one\n";



    $before = microtime(true);

    for ($i=0 ; $i<$count; $i++) {
        function_two();
    }

    $after = microtime(true);
    echo ($after-$before)/$i . " sec/function two\n";
}
benchmark();

结果:

1.1471637010574E-6 sec/function one (preg_replace)
1.6027762889862E-6 sec/function two (str_ireplace)

1
这是另一种方法。
class orbisius_custom_string {
    /**
     * The reverse of nl2br. Handles <br/> <br/> <br />
     * usage: orbisius_custom_string::br2nl('Your buffer goes here ...');
     * @param str $buff
     * @return str
     * @author Slavi Marinov | http://orbisius.com
     */
    public static function br2nl($buff = '') {
        $buff = preg_replace('#<br[/\s]*>#si', "\n", $buff);
        $buff = trim($buff);

        return $buff;
    }
}

0

编辑:之前的答案与您想要的相反。请使用str_replace。 用\n替换<br>

echo str_replace('<br>', "\n", $var1);

2
它的功能相反,将所有换行符转换为br标签。 - Dan LaManna

0
<?php

$var1 = "Line 1 info blah blah <br /> Line 2 info blah blah";
$var1 = str_replace("<br />", "\n", $var1);

?>

<textarea><?php echo $var1; ?></textarea>

你是想将$var1设置为什么呢?所以:$var1 = str_replace("<br />", "\n", $var1); - Dan LaManna
不,我没有。它会创建一个新行,只是你的文本区域没有在codepad中呈现。 - Dan LaManna
不,我的CodePad示例可行。请再次查看您的示例。 - Jared Farrish
Codepad无法呈现文本区域,您在输出中看到了文本区域还是只有<textarea>标签?http://screencast.com/t/BklEkcjNx - Dan LaManna
<textarea class="hobbieTalk" id="hobbieTalk" name="hobbieTalk" cols="35" rows="5" onchange="contentHandler('userInterests',this.id,this.value,0)"><?php $convert = str_replace("<br />", "\n", $_SESSION["hobbieTalk"]); echo $convert; ?></textarea> - 这仍然失败。 - someguy
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接