梦之源泉 - 2020年3月
type: channel
link: http://www.mzyq.com/2020/03/
description: 有梦才有未来
items: php自定义函数nl2p

php自定义函数nl2p
type: item
date: 2020-03-16T16:57:00+08:00
description: php有一个函数nl2br，可以把文本中的换行符变成 《br /》，但是有的时候，我们需要的是单个换行符换行变成《br /》，两个及以上换行符变成《p》。（注：这里的中文书名号其实要写成英文尖括号的，原因你懂得。）网上搜索nl2p第一个就是cnblogs这个博客，那我姑且当做他是源站点吧。https://www.cnblogs.com/hejianrong/p/5802010.html源码摘抄如下/** * Returns string with newline formatting converted into HTML paragraphs. * * @param string $string String to be formatted. * @param boolean $line_breaks When true, single-line line-breaks will be converted to HTML break tags. * @param boolean $xml When true, an XML self-closing tag will be applied to break tags ( ). * @return string */ function nl2p($string, $line_breaks = true, $xml = true) { // Remove existing HTML formatting to avoid double-wrapping things $string = str_replace(array(' ', ' ', ' ', ' '), '',$string); // It is conceivable that people might still want single line-breaks // without breaking into a new paragraph. if ($line_breaks == true) return ' '.preg_replace(array("/([\n]{2,})/i","/([^>])\n([^<])/i"), array(" \n ", '<br'.($xml == true ? ' /' :'').'>'), trim($string)).' '; else return ' '.preg_replace("/([\n]{1,})/i", " \n ", trim($string)).' '; } 这个函数有两个选项。当然我觉得$xml要恒等于true的，因为现在html5提倡闭合的写法，就是< br / >这样。然后$line_breaks=false 是换行即换段落，ture是换行就是换行，但是英文会删去前一行最后一个字和第二行第一个字，中文会变成乱码（因为中文通常是2-3字符）。我想要的功能是一个换行符就是换行，两个或以上就是段落。但我对正则又不熟悉。最后折腾后终于改造成自己的nl2p。如下function nl2p($string) { // Remove existing HTML formatting to avoid double-wrapping things $string = str_replace(array(' ', ' ', ' ', ' '), '',$string); // It is conceivable that people might still want single line-breaks // without breaking into a new paragraph. return ' '.preg_replace(array("/([\n]{2,})/i","/[\n]/i"), array(" ", ' '), trim($string)).' '; } 经过测试，非常完美。