您好,欢迎访问一九零五行业门户网

PHP学习笔记 2009

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”,以此类推,下面是一些示例(注释即为输出内容):
1.2.3.3 第三个参数是需要截取的字符个数,其默认值为“1”。如果该参数为“0”,则输出空字符串。如果为正数i,则返回从$start开始的i个字符组成的字符串,如果从$start开始至字符串尾的字符个数不足i个,则返回从$start开始直到字符串尾的字符串。如果为负数-i,则会先取$start开始至字符串尾得到字符串$strtmp,再从$strtmp中去掉从结尾开始的i个字符,将得到的字符串作为最后的结果字符串,如果i大于$strtmp的长度,则返回空字符串。下面是一些示例(注释即为输出内容):
1.2.3.4 第四个参数指定以何种字符编码作为标准识别字符串中的字符,默认值为iso-8859-1,即latin-1,使用gb2312(简体中文)后一个汉字或一个英文字符都被当成一个“字”(汉字占两个字节),另外一个常用的是utf-8(unicode),下面是示例(注释即为输出内容):
这里又引入了另一个的函数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的字符串处理函数很丰富啊!
其它类似信息

推荐信息