字符串截取对于我们码农来说是家常便饭了,网页前台后台都容易用到,但是对一些中英文混合的字符串截取还是头疼容易出现乱码,因为汉字在gb2312编码中占有2个字符,所以容易出现截取一半的情况。我也一直想找这样的一些库函数,比如mb_substr函数,不过使用它需要php依赖附加一些库的加载。
$str = "my英文名ciaos"; print_r(substr($str,0,3)); //输出"my?" print_r(substr($str,3,3)); //输出"⑽?"
可以看见substr字符串截取是多么费劲了吧,我也参照了网上别人的一些例子,没有发现一个满意好用的,于是自己修改其中一个并做一些字符串截取的测试,希望能保证准确性。函数代码如下:
/** * my_substr() * * deal with "gb2312" encode string * * @param string $str * @param int $start * @param int $length * @param bool $append * @return result */ function my_substr($str,$start,$length,$append = false) { $retstr = ''; $strlen = strlen($str); for($i=0; $i<$strlen; $i++) { if($i>=$start && $i< ($start+$length)) { if(ord(substr($str, $i, 1))>127) { $retstr.= substr($str, $i, 2); } else { $retstr.= substr($str, $i, 1); } } if($i>$start+$length) {break;} if(ord(substr($str, $i, 1))>127) $i++; } if($i<$strlen && $append){ $retstr.= "..."; } return $retstr; }代码很少很简单,我们来做一些测试看看效果,同样是上面那个错误示例。
$str = "my英文名ciaos"; print_r(my_substr($str, 0, 3)); //输出"my英"(如果结束于汉字中间,则追加显示中文) print_r(my_substr($str, 3, 3)); //输出"文" (如果起始于汉字中间,则抛弃首位汉字)调换字符串再测试一次
$str = "我的ciaos英文名"; print_r(my_substr($str, 0, 3)); //输出"我的"(如果结束于汉字中间,则追加显示中文) print_r(my_substr($str, 3, 3)); //输出"ci" (如果起始于汉字中间,则抛弃首位汉字)my_substr函数最后一个参数默认为false,控制是否在截取的字符串后面加上省略号。
$str = "我的ciaos英文名"; print_r(my_substr($str, 7, 20, true)); //输出"os英文名"(字符串截取到最后了,不用追加省略号) print_r(my_substr($str, 7, 3, true)); //输出"os英..." (字符串未达到最后,追加省略号)对于UTF-8编码的字符串截取需要别的处理,毕竟中文字符需要占据三个字节,我这个函数应该能处理大多前台网页截取字符串的需求了