nl2br

(PHP 4, PHP 5, PHP 7, PHP 8)

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

说明

nl2br(string $string, bool $use_xhtml = true): string

返回一个在所有换行符 (\r\n, \n\r, \n\r) 之前插入 <br /><br>string

参数

string

输入字符串。

use_xhtml

是否使用与 XHTML 兼容的换行符。

返回值

返回修改后的字符串。

范例

范例 #1 使用 nl2br()

<?php
echo nl2br("foo isn't\n bar");
?>

上面的示例将输出

foo isn't<br />
 bar

范例 #2 使用 use_xhtml 参数生成有效的 HTML 标记

<?php
echo nl2br("Welcome\r\nThis is my HTML document", false);
?>

上面的示例将输出

Welcome<br>
This is my HTML document

范例 #3 各种换行符分隔符

<?php
$string
= "This\r\nis\n\ra\nstring\r";
echo
nl2br($string);
?>

上面的示例将输出

This<br />
is<br />
a<br />
string<br />

参见

添加说明

用户贡献说明 17 个说明

CGameProgrammer at gmail dot com
19 年前
重要的是要记住,此函数不会将换行符替换为 <br> 标记。相反,它在每个换行符之前插入一个 <br> 标记,但它仍然保留换行符本身!这在我编写的函数中造成了一些问题——我忘记了换行符仍然被保留。

如果您不想要换行符,请执行以下操作

<?php
$Result
= str_replace( "\n", '<br />', $Text );
?>
ngkongs at gmail dot com
17 年前
将所有换行符替换为 <br />
最佳解决方案(IMO)是

<?php
function nl2br2($string) {
$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
return
$string;
}
?>

因为每个操作系统都有不同的 ASCII 字符用于换行
Windows = \r\n
Unix = \n
Mac = \r

对我来说很完美
N/A
15 年前
这里有一个更简单的

<?php
/**
* 将 BR 标记转换为 nl
*
* @param string 要转换的字符串
* @return string 转换后的字符串
*/
function br2nl($string)
{
return
preg_replace('/\<br(\s*)?\/?\>/i', "\n", $string);
}
?>

享受
fquffio at live dot it
10 年前
从 PHP 4.3.10 和 PHP 5.0.2 开始,这应该是将 <br /> 和 <br> 标记替换为换行符和回车符的最正确方法。
<?php
/**
* 将 BR 标记转换为换行符和回车符。
*
* @param string 要转换的字符串
* @return string 转换后的字符串
*/
function br2nl ( $string )
{
return
preg_replace('/\<br(\s*)?\/?\>/i', PHP_EOL, $string);
}
?>
(请注意,这是对该函数的一个小改动: https://php.net/nl2br#86678 )

您可能还想“特定于平台”,因此此函数可能会有所帮助
<?php
/**
* 将 BR 标记转换为换行符和回车符。
*
* @param string 要转换的字符串
* @param string 要用作行分隔符的字符串
* @return string 转换后的字符串
*/
function br2nl ( $string, $separator = PHP_EOL )
{
$separator = in_array($separator, array("\n", "\r", "\r\n", "\n\r", chr(30), chr(155), PHP_EOL)) ? $separator : PHP_EOL; // 检查提供的 $separator 是否有效。
return preg_replace('/\<br(\s*)?\/?\>/i', $separator, $string);
}
?>
aabaev
5 年前
双引号 !== 单引号

php > echo nl2br('\r\n');
\r\n
php > echo nl2br("\r\n");
<br />
Anders Norrbring
18 年前
看到所有这些关于 br2nl 函数的建议,我也可以看到,没有一个对书写草率的 HTML 换行符有效。我们知道,用户无法被信任编写好的代码,而且混合大小写并不罕见。

我认为这段小代码可以完成大多数工作,包括 XHTML 样式和 HTML,甚至混合大小写,如 <Br> <bR /> 以及 <br > 或 <br />。

<?php
function br2nl($text)
{
return
preg_replace('/<br\\s*?\/??>/i', '', $text);
}
?>
chad at nobodyfamous dot ca
6 年前
我花了一整天时间试图弄清楚为什么我的 textarea $_POST 没有通过 nl2br() 添加 <br /> 标记。因此,对于其他人来说

<?php filter_input(INPUT_POST, 'text', FILTER_SANITIZE_SPECIAL_CHARS); ?> 将换行符返回为 &#13; 和 &#10;,因此 nl2br 将错过它们。

建议使用 <?php filter_input(INPUT_POST, 'text', FILTER_SANITIZE_STRING); ?>,换行符将保留,因此 nl2br 将会识别它们。
Justinas M.
8 年前
这是一个使用 "\R" 正则表达式标记的示例,它匹配任何 Unicode 换行符。
"u" 标记将字符串视为 UTF-16。根据您的使用情况,这是可选的。

<?php

public function nl2br($string)
{
return
preg_replace('/\R/u', '<br/>', $string);
}

?>

注意
preg_replace 版本比使用 str_replace 版本或内置 nl2br 慢得多。
查看 pcre.backtrack_limit php.ini 设置以了解有关 PCRE 限制的信息。了解这一点很重要。

一些 PHP7 基准测试
<?php

// nl2br()

function nl2br_str($string) {
return
str_replace(["\r\n", "\r", "\n"], '<br/>', $string);
}

function
nl2br_preg_R($string)
{
return
preg_replace('/\R/u', '<br/>', $string);
}

function
nl2br_preg_rnnr($string)
{
return
preg_replace('/(\r\n|\n|\r)/', '<br/>', $string);
}

?>

# nl2br
## 时间: 0.02895712852478 秒

# nl2br_str
## 时间: 0.027923107147217 秒

# nl2br_preg_R
## 时间: 0.13350105285645 秒

# nl2br_preg_rnnr
## 时间: 0.14213299751282 秒
leo dot mauro dot desenv at gmail dot com
8 年前
我以经验的方式测试了这些函数 nl2br 和 nl2br2(由 ngkongs at gmail dot com 创建)。
两者都适用于不同的 ASCII 换行符,但函数 nl2br2 比 nl2br 快。

nl2br2 ~ 0.0000309944153 秒
nl2br ~ 0.0011141300201 秒

函数 nl2br2
<?php
function nl2br2($string) {
$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
return
$string;
}
?>
blacknine313 at gmail dot com
16 年前
在 Dev Shed 论坛上最近的一篇帖子中,我注意到它没有提到,所以我要提一下。

nl2br 返回纯 HTML,因此它应该在 PHP 反 HTML 函数(如 strip_tags 和 htmlspecialchars)之后。
Collette
4 年前
假设一个表单文本字段包含
测试行号 1
测试行号 2

要删除所有换行符并将输入拆分为数组

$input_from_text_field = preg_replace('#[\r\n]#','',nl2br($input_from_text_field,false));
$lines = explode("<br>",$input_from_text_field);

$lines 现在将是一个数组,其中 $lines[0] = "测试行号 1" 等等。
gautier dot michelin at gmail dot com
4 年前
这是一个将换行符转换为段落 $string 的简单技巧

<?php
$string_with_paragraphs
= "<p>".implode("</p><p>", explode("\n", $string))."</p>";
?>

通过在换行符处进行拆分并添加 p 的结束和开始,很容易与 <p> 连接起来。

您可以将其放入一个函数中

<?php
function nl2p($string) {
return
$string_with_paragraphs = "<p>".implode("</p><p>", explode("\n", $string))."</p>";
}
?>
buzanits at gmail dot com
6 年前
如果您编写的代码要在浏览器和 shell 上运行,此函数可能会有用。它根据运行的平台使用 PHP_EOL 或 <br />

<?php
function nl($string) {
if(isset(
$_SERVER['SHELL'])) return preg_replace('/\<br(\s*)?\/?\>/i', PHP_EOL, $string);
return
nl2br($string);
}

print
nl("One\nTwo<br>Three\r\nFour<br />Five
Six"
. PHP_EOL);
?>
j dot mons54 at gmail dot com
12 年前
用于 bbcode

<?php
$message
= nl2br(preg_replace('#(\\]{1})(\\s?)\\n#Usi', ']', stripslashes($message)));
?>
darenschwenke at yahoo dot com
10 年前
此方法适用于带有属性的 br 标签,无论如何,
是否关闭,并且不会加倍换行符

<?php
/**
* 将 br 标签转换为 nl
*
* @param string 要转换的字符串
* @return string 转换后的字符串
*/

function br2nl($string)
{
return
preg_replace("/<br[^>]*>\s*\r*\n*/is", "\n", $string);
}
?>

我将它与 strip_tags() 结合使用,用于非常简单的“contenteditable”字段,只允许文本和换行符。
Patrik
1 年前
考虑使用 CSS 的 `white-space: pre-line;`,它与 nl2br() 的作用相同。
hyponiq at gmail dot com
16 年前
相反,<b>mark at dreamjunky.comno-spam</b>,此函数的命名是正确的。让我解释一下。虽然它确实重新添加了换行符,但它是为了尝试保持与 W3C 代码格式建议的标准兼容性。

根据这些建议,换行符标签后面必须有一个换行符。在这种情况下,换行符不会被删除,而是会添加一个换行符标签,以便在不需要或不需要段落的浏览器中正确显示。
To Top