Home  >  Article  >  php教程  >  PHP学习笔记 2009

PHP学习笔记 2009

WBOY
WBOYOriginal
2016-06-06 19:49:11956browse

PHP 学习笔记 2009-8-19 主题:自动生成记事主题的函数 generateNoteTitle() 1 要点 1.1 自动生成主题 QQ 邮箱的在线写记事,如果不写主题,那么它可以自动生成一个主题。我自己也写了个函数实现这个功能,这个函数应该有一下两种功能: ( 1 )取正文第一非

PHP学习笔记

2009-8-19

 

主题:自动生成记事主题的函数generateNoteTitle()

 

1 要点

1.1 自动生成主题

QQ邮箱的在线写记事,如果不写主题,那么它可以自动生成一个主题。我自己也写了个函数实现这个功能,这个函数应该有一下两种功能:

1)取正文第一非空行作为主题,去掉该行的前导空字符,再取前50个“字”,再去掉后续空字符,最后得到的字符串作为主题

2)更进一步,如果主题和正文都为空,那么主题应为“(无主题)”

 

1.2 实现过程中用到的字符串处理函数:ltrim()rtrim()mb_substr()strpos()implode()

1.2.1 string ltrim(string $str [, string $charlist])

该函数功能为去掉字符串$str前导空字符。

该函数有两个参数,

1.2.1.1 第一个参数是需要处理的字符串;

 

1.2.1.2 第二个参数是自定义的想去掉的字符集,如果不给出第二个参数,则默认将删除以下几种空字符:

l         " " (ASCII 32 (0x20)), an ordinary space.(空格)

l         "/t" (ASCII 9 (0x09)), a tab.(制表

l         "/n" (ASCII 10 (0x0A)), a new line (line feed).(换行符)

l         "/r" (ASCII 13 (0x0D)), a carriage return.(回车)

l         "/0" (ASCII 0 (0x00)), the NUL-byte.

l         "/x0B" (ASCII 11 (0x0B)), a vertical tab.纵向制表符

 

1.2.2 string rtrim(string $str [, string $charlist])

该函数功能为去掉字符串$str后续空字符。

函数的参数跟上一个函数一样。另外,如果想前导后续空字符一起去除,可以使用函数trim() ,参数完全一样。

 

1.2.3 string mb_substr(string $str, int $start [, int $length [, string $encoding]])

这个函数跟substr()的区别在于该函数可以识别多字节字符,比如汉字。

1.2.3.1 第一个参数为要处理的字符串;

 

1.2.3.2 第二个参数指示从哪个字符开始截取,第一个字符的位置是“0”,以此类推。另外如果$start大于等于字符串长度,函数会返回FALSE。如果该参数为负数,则从字符串尾开始计算,倒数第一个字符的位置是“-1”,以此类推,下面是一些示例(注释即为输出内容):

$rest mb_substr("abcdef", -1);    // returns "f"

$rest mb_substr("abcdef", -2);    // returns "ef"

$rest mb_substr("abcdef", -31); // returns "d"

?>

 

1.2.3.3 第三个参数是需要截取的字符个数,其默认值为“1”。如果该参数为“0”,则输出空字符串。如果为正数i,则返回从$start开始的i个字符组成的字符串,如果从$start开始至字符串尾的字符个数不足i个,则返回从$start开始直到字符串尾的字符串。如果为负数-i,则会先取$start开始至字符串尾得到字符串$strtmp,再从$strtmp中去掉从结尾开始的i个字符,将得到的字符串作为最后的结果字符串,如果i大于$strtmp的长度,则返回空字符串。下面是一些示例(注释即为输出内容):

$rest mb_substr("abcdef"0, -1);  // returns "abcde"

$rest mb_substr("abcdef"2, -1);  // returns "cde"

$rest mb_substr("abcdef"4, -4);  // returns ""

$rest mb_substr("abcdef", -3, -1); // returns "de"

?>

 

1.2.3.4 第四个参数指定以何种字符编码作为标准识别字符串中的字符,默认值为ISO-8859-1,即Latin-1,使用GB2312(简体中文)后一个汉字或一个英文字符都被当成一个“字”(汉字占两个字节),另外一个常用的是UTF-8Unicode),下面是示例(注释即为输出内容):

$rest mb_strlen("abc你好");  // returns "7"

$rest mb_strlen("abc你好"‘Latin1’);  // returns "7"

$rest mb_strlen ("abc你好"‘UTF-8’);  // returns "6",这里不是“5”,所以用UTF-8处理简体中文是不行的

$rest mb_strlen ("abc你好"‘GB2312’);  // returns "5"

 

$rest mb_substr("abc你好"0, 7);  // returns "abc你好"

$rest mb_substr("abc你好"05, ‘Latin1’);  // returns "abc"

$rest mb_substr("abc你好"04, ‘Latin1’);  // returns "abc ",这里abc后有一个空格,那是半个“你”字,系统不认识,显示为一个空格

$rest mb_substr("abc你好"04, ‘UTF-8’);  // returns " abc"

$rest mb_substr("abc你好"05, ‘GB2312’); // returns " abc你好"

?>

这里又引入了另一个的函数mb_strlen(string $str [, string $encoding]),是以给定的编码标准来计算多字节(Multi-byte,即mb)字符串长度。开始我还准备使用UTF-8,结果试过上面的代码后我发现“你好”两个字的UTF-8编码长度是3,查了百度知道才知道UTF-8是变长编码,两个字节的汉字有在编码后可能会变成3个字节,而汉字的GB2312编码固定是两个字节,所以还是只有使用GB2312

 

这里还有一个有意思的问题:

因为我要截取第一行,即,从第一个字符一直到第一个换行符(“/n”)之前,所以我需要访问字符串$title里的某个字符,于是我便试着像数组一样用“[]”引用(使用“{}”也可以),刚开始没问题,引用完后,我用某个字符串处理函数处理$title,却报错说“从数组到字符串的转换”。数组?原来我这么一引用就让$title从字符串变成了数组,得想法让它变回来。试试强制类型转换,不行;百度一下,哦,原来还有个implode()可以帮忙,后面1.2.5说说它的用法。

 

1.2.4 int strpos ( string $haystack, mixed $needle [, int $offset] )

该函数查找$needle字符串$haystack从开头偏移$offset个字符后的字符串里第一次出现的位置,如果$needle不是字符串,则它将被转换为integer,并被当做字符的数字序号。如果没有找到$needle,则返回FALSE。这里问题来了,因为该函数可能返回布尔值FALSE,但也可能返回一个与FALSE等值的非布尔值,例如0或者""。所以应使用===”(全等比较符,符号两端值相等且类型相等才为真)运算符来测试该函数的返回值是否为FALSE

 

1.2.5 int implode ( string $glue, array $pieces )

将数组$pieces的所有元素按顺序排列组成字符串,并在每两个元素之间插入字符串$glue。那么这个函数就可以解决刚才提到的“从数组到字符串的转换”问题,使用implode("", $title)就行了。

 

2 源代码

 

//生成记事标题函数generateNoteTitle

//如果没有标题,则取正文第一非空行去掉前导后续空字符后的前50个字(如果超过50个字),再去掉这50个字的字符串的后续空字符,将最后得到的字符串作为标题

//注意,这里使用的是mb_substr(),且以GB2312作为编码标准,因此一个汉字或一个英文字母都算作一个“字”

function generateNoteTitle($noteContent)

{

       $title = "";//初始化返回变量

       $content = ltrim($noteContent);//先去掉正文的前导空字符

      

       $newLinePos = strpos($content, "/n");//在正文中查找换行符

       if($newLinePos === FALSE)//如果没有换行符(注意这里用的是全等比较符),说明第一非空行即为正文唯一的一行

       {

              if($content == "")//如果此时正文为“”,则标题为“(无标题)”

              {

                     $title = "(无主题)";

              }

              else//如果此时正文不为空,则标题为这唯一的一行取前50个字再去掉后续空字符后的字符串

              {

                     $title = mb_substr($content, 0, 50, 'GB2312');//使用函数mb_substr(),如果去掉后续空字符后的字符串不足50个字,则函数将取其全部

                     $title = rtrim($title);

              }

       }

       else//如果有换行符,则截取第一个换行符之前的那部分字符串,取前50个字再去掉后续空字符

       {

              for($cnt = 0; $cnt 截取

              {

                     $title[$cnt] = $content[$cnt];//也可以用“{}”来引用字符串的某个字符,但是引用会使$title变为数组变量

              }

             

              $title = implode("", $title);//$title和“”组合,实际上是为了使$title重新变回字符串变量

              $title = mb_substr($title, 0, 50, 'GB2312');//使用函数mb_substr(),如果去掉后续空字符后的字符串不足50个字,则函数将取其全部

              $title = rtrim($title);

       }

      

       return $title;

}

 

3 总结

PHP的字符串处理函数很丰富啊!

 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn