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

PHP学习笔记 2009

WBOY
WBOYoriginal
2016-06-06 19:49:11961parcourir

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的字符串处理函数很丰富啊!

 

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn