PHP中有一个nl2br($string)函数
使用textarea将数据存储到mysql后,页面上读取到这个字段后使用nl2br($string)就可以了。
在输出的时候就换行了。
如果不使用nl2br($string)的话就完全是在一行上显示了,非常的不美观。
今天咱们聊聊PHP里的nl2br函数,说实话,这玩意看起来简单,用起来也不复杂,但真正玩起来还真有不少坑。咱们从基础开始,慢慢深入到一些实际应用场景,顺便帮你避开那些可能会让你抓狂的坑。
nl2br是啥?它的全名是“new line to break”,意思就是把字符串里的换行符\n转换成HTML的
标签。比如你有个多行文本,用户输入的时候是敲回车换行的,但你直接输出到HTML里,浏览器是不认\n的,文本看起来会连在一起。这时候nl2br就出场了,帮你把\n变成
,让文本在网页上显示换行的效果。
先看个最简单的例子:
php
$text = "第一行\n第二行\n第三行";
echo nl2br($text);
输出结果是:
第一行
第二行
第三行
挺简单的?但你可能会说,这有啥好讲的,不就是个字符串替换吗?别急,咱们慢慢深入。
第一个坑:nl2br默认只替换\n,但换行符有3种:\n(Unix/Linux)、\r\n(Windows)、\r(老Mac)。如果你用了nl2br,结果发现Windows用户输入的文本换行没生效,问题可能就在这。nl2br只认\n,所以你需要自己处理一下:
php
$text = str_replace("\r\n", "\n", $text); // 先把Windows换行符变成Unix的
这就万无一失了。
第二个坑:nl2br默认输出的
标签是XHTML风格的,也就是自闭合标签。如果你用的是HTML5,标签可以简写成
。这时候你需要用到nl2br的第二个参数,把它设为true:
php
echo nl2br($text, true); // 输出
而不是
搞定。
第三个坑:如果你是在一个富文本编辑器里输出的内容,比如用户用了TinyMCE或者CKEditor,这些编辑器已经自动帮你把换行符转换成了
或者
标签。这时候你再调用nl2br,就会出现一堆重复的换行标签。你需要先判断一下这些标签是否存在:
if (!preg_match('/
$text = nl2br($text);
}
这样就避免了重复替换。
第四个坑:如果你是在处理API返回的数据,比如JSON,换行符可能是\n或者\r\n,但JSON解析后换行符可能会变成\\n或者\\r\\n,也就是被转义了。这时候直接用nl2br是没效果的,你需要先把这些转义字符还原:
php
$text = str_replace('\\n', "\n", $text);
这就OK了。
第五个坑:如果你是在处理邮件内容,邮件头的换行符是\r\n,但邮件正文的换行符可能是\n或者\r\n。你需要在处理邮件内容的时候特别注意,先统一换行符:
php
$body = str_replace("\r\n", "\n", $body);
echo nl2br($body);
这样邮件内容就能正确显示了。
好了,坑点讲完了,咱们来说点进阶的玩法。nl2br看起来简单,但其实可以玩出不少花样。
场景一:处理表单输入
用户在表单里输入了多行内容,比如一个评论。你需要在保存到数据库之前处理换行符,同时还要防止XSS攻击:
php
$comment = htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8'); // 防止XSS
$comment = str_replace("\r\n", "\n", $comment); // 统一换行符
$comment = str_replace("\r", "\n", $comment);
$comment = nl2br($comment); // 转换换行符
echo $comment;
这样就安全又规范了。
场景二:处理Markdown内容
如果你在用Markdown,Markdown的换行符是两个空格加一个换行符。你可以在Markdown解析后,再用nl2br处理剩余的换行符:
php
$markdown = "第一行 \n第二行\n第三行";
$html = Markdown::parse($markdown); // 假设用了一个Markdown解析器
$html = nl2br($html);
echo $html;
这样Markdown和普通换行都能正确显示。
场景三:处理日志文件
日志文件通常是以换行符分隔的,你需要在输出日志内容时把换行符转换成
:
php
$log = file_get_contents('log.txt');
$log = nl2br($log);
echo $log;
这样日志内容就能在网页上正确显示了。
场景四:处理API返回的文本数据
比如你从某个API获取了一段文本数据,里面可能有\n或者\r\n,你需要在输出前统一处理:
php
$response = file_get_contents('https://api.example.com/text');
$text = json_decode($response, true)['text'];
$text = str_replace("\r\n", "\n", $text);
$text = nl2br($text);
echo $text;
这样API返回的文本数据就能正确显示了。
咱们聊聊nl2br的性能。其实nl2br的性能表现还不错,因为它只是简单地在字符串里查找\n并替换成
。如果你处理的文本很长,频繁调用nl2br可能会有性能问题,这时候可以考虑用正则表达式批量替换:
php
$text = preg_replace("/\r\n|\n|\r/", "
", $text);
这样效率会更高一些。
好了,关于nl2br的技术分享就到这里。虽然它看起来是个小函数,但用好了能让你的代码更健壮、更灵活。下次你再用nl2br的时候,别忘了检查一下各种坑点,别让这个小函数给你挖个大坑。