重要的是要记住,此函数不会将换行符替换为 <br> 标记。相反,它在每个换行符之前插入一个 <br> 标记,但它仍然保留换行符本身!这在我编写的函数中造成了一些问题——我忘记了换行符仍然被保留。
如果您不想要换行符,请执行以下操作
<?php
$Result = str_replace( "\n", '<br />', $Text );
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
nl2br — 在字符串中的所有换行符之前插入 HTML 换行符
返回一个在所有换行符 (\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 />
重要的是要记住,此函数不会将换行符替换为 <br> 标记。相反,它在每个换行符之前插入一个 <br> 标记,但它仍然保留换行符本身!这在我编写的函数中造成了一些问题——我忘记了换行符仍然被保留。
如果您不想要换行符,请执行以下操作
<?php
$Result = str_replace( "\n", '<br />', $Text );
?>
将所有换行符替换为 <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
对我来说很完美
这里有一个更简单的
<?php
/**
* 将 BR 标记转换为 nl
*
* @param string 要转换的字符串
* @return string 转换后的字符串
*/
function br2nl($string)
{
return preg_replace('/\<br(\s*)?\/?\>/i', "\n", $string);
}
?>
享受
从 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);
}
?>
看到所有这些关于 br2nl 函数的建议,我也可以看到,没有一个对书写草率的 HTML 换行符有效。我们知道,用户无法被信任编写好的代码,而且混合大小写并不罕见。
我认为这段小代码可以完成大多数工作,包括 XHTML 样式和 HTML,甚至混合大小写,如 <Br> <bR /> 以及 <br > 或 <br />。
<?php
function br2nl($text)
{
return preg_replace('/<br\\s*?\/??>/i', '', $text);
}
?>
我花了一整天时间试图弄清楚为什么我的 textarea $_POST 没有通过 nl2br() 添加 <br /> 标记。因此,对于其他人来说
<?php filter_input(INPUT_POST, 'text', FILTER_SANITIZE_SPECIAL_CHARS); ?> 将换行符返回为 和 ,因此 nl2br 将错过它们。
建议使用 <?php filter_input(INPUT_POST, 'text', FILTER_SANITIZE_STRING); ?>,换行符将保留,因此 nl2br 将会识别它们。
这是一个使用 "\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 秒
我以经验的方式测试了这些函数 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;
}
?>
在 Dev Shed 论坛上最近的一篇帖子中,我注意到它没有提到,所以我要提一下。
nl2br 返回纯 HTML,因此它应该在 PHP 反 HTML 函数(如 strip_tags 和 htmlspecialchars)之后。
假设一个表单文本字段包含
测试行号 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" 等等。
这是一个将换行符转换为段落 $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>";
}
?>
如果您编写的代码要在浏览器和 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);
?>
用于 bbcode
<?php
$message = nl2br(preg_replace('#(\\]{1})(\\s?)\\n#Usi', ']', stripslashes($message)));
?>
此方法适用于带有属性的 br 标签,无论如何,
是否关闭,并且不会加倍换行符
<?php
/**
* 将 br 标签转换为 nl
*
* @param string 要转换的字符串
* @return string 转换后的字符串
*/
function br2nl($string)
{
return preg_replace("/<br[^>]*>\s*\r*\n*/is", "\n", $string);
}
?>
我将它与 strip_tags() 结合使用,用于非常简单的“contenteditable”字段,只允许文本和换行符。
相反,<b>mark at dreamjunky.comno-spam</b>,此函数的命名是正确的。让我解释一下。虽然它确实重新添加了换行符,但它是为了尝试保持与 W3C 代码格式建议的标准兼容性。
根据这些建议,换行符标签后面必须有一个换行符。在这种情况下,换行符不会被删除,而是会添加一个换行符标签,以便在不需要或不需要段落的浏览器中正确显示。