今天项目要把详情页的title、keywords、description根据现实的内容修改一下,其中对description提了一个要求,要截取正文内容的前74个字符。
这很简单啊
$description =substr($info['content'], 0, 74);
但是测试后发现显示出一大堆HTML标签,看着很凌乱。于是查找一下有没有去除字符串中的HTML标签的函数,刚好有strip_tags()。定义如下:
strip_tags(string,allow)** 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。
注释:该函数始终会剥离 HTML 注释。这点无法通过 allow 参数改变。
注释:该函数是二进制安全的。
string
必需。规定要检查的字符串。
allow
可选。规定允许的标签。这些标签不会被删除。
于是我把截取字符串的代码改成下面的代码。
$description =substr(strip_tags($info['content']), 0, 74);
然而测试以后发现截取的字符根本没有74个啊,而且还有乱码。再次搜索发现substr只适合截取英文字符,要截取中文可以使用mb_substr($str, $start, $length, $encoding)。于是我的代码变成下面的样子。
$description =mb_substr(strip_tags($info['content']), 0, 74, 'utf-8');
Bingo!这次总算不出错了!
那来详细看看mb_substr这个函数吧。
下面内容选择性摘自http://www.111cn.net/phper/php/48714.htm 和 http://www.111cn.net/phper/31/60157.htm
字符串只要出现中文字符,就有可能导致PHP substr中文乱码,因为中文UTF-8编码,每个汉字占3字节,而GB2312占2字节,英文占1字节,截取位数不准确,substr()硬生生地将一个中文字符“锯”成两半,造成断开的字符会把其后的字符拉过来一起做一个字,所以出现了PHP substr中文乱码。
而mbstring扩展库就解决了这个问题。但它在php中是默认不被支持的,我们需要在php目录下找到php.ini打开编辑,搜索mbstring.dll,找到;extension=php_mbstring.dll。把前面的;号去掉才可以使用mb_substr函数哦。mbstring扩展库中还有mb_strcut()也可以用来截取中文字符串。那它和mb_substr()有何不同呢?
看一个例子:
<?php echo mb_substr('这样一来我的字符串就不会有乱码_', 0, 7, 'utf-8'); ?>
输出“这样一来我的字”共7个汉字。
<?php echo mb_strcut('这样一来我的字符串就不会有乱码_', 0, 7, 'utf-8');? >
输出“这样一”三个汉字。
从上面的例子可以看出,mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象……
<?php
echo mb_substr('飞花院博客feihuayuan',0,9);
//返回: 飞花院
echo mb_substr('飞花院博客feihuayuan',0,9,'utf-8');
//则返回: 飞花院博客feih
mb_strcut('飞花院博客feihuayuan',0,9,'utf-8');
//则返回:飞花院
?>
从上面实例可以看得出来,substr只支持单字节的,这样只适合英文截取,而mb_substr函数是双字体截取了,正好可用于中文了,而mb_strcut是三字节了。