分类 php 下的文章

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 (<br />).
 * @return string
 */
function nl2p($string, $line_breaks = true, $xml = true)
{
    // Remove existing HTML formatting to avoid double-wrapping things
    $string = str_replace(array('<p>', '</p>', '<br>', '<br />'), '',$string);
     
    // It is conceivable that people might still want single line-breaks
    // without breaking into a new paragraph.
    if ($line_breaks == true)
        return '<p>'.preg_replace(array("/([\n]{2,})/i","/([^>])\n([^<])/i"), array("</p>\n<p>", '<br'.($xml == true ? ' /' :'').'>'), trim($string)).'</p>';
    else
        return '<p>'.preg_replace("/([\n]{1,})/i", "</p>\n<p>", trim($string)).'</p>';
}

这个函数有两个选项。当然我觉得$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('<p>', '</p>', '<br>', '<br />'), '',$string);

    // It is conceivable that people might still want single line-breaks
    // without breaking into a new paragraph.
    
      return '<p>'.preg_replace(array("/([\n]{2,})/i","/[\n]/i"), array("</p><p>", '<br />'), trim($string)).'</p>';
}

经过测试,非常完美。

date("M-d Y , h:i:s")显示的是服务器本地的时间,比如纽约的时间。
time()显示的是时间戳(UTC1970-1-1 0点开始的秒数)。
gmdate("M-d Y , h:i:s")显示的永远是UTC时间,不管服务器本地,也不管php.ini怎样设定,也不管php语句中设置的时区。
如果要显示北京时间可以gmdate("M-d Y , h:i:s",time()+3600*8)

echo 'SERVER_NAME:'.$_SERVER['SERVER_NAME']; //获取当前域名(不含端口号)

echo 'HTTP_HOST:'.$_SERVER['HTTP_HOST'];//获取当前域名(含端口号)

echo 'REQUEST_URI:'.$_SERVER['REQUEST_URI'];//获取当前域名的后缀
看起来第一个和第二个差不多,就是差一个端口号的问题,但是其实不一样。比如nginx的默认主机,里面写“server_name _”;
那么你用ip或者未绑定域名访问它,那么$_SERVER['SERVER_NAME']显示的是是“_”,而$_SERVER['HTTP_HOST']显示的是该ip和该域名。也就是说$_SERVER['SERVER_NAME']显示的是你配置文件里的server name,而$_SERVER['HTTP_HOST']显示的是你浏览器地址栏里面的域名。