中文截取无乱码、 顺序查找和二分查找函数
2013-08-26 22:40
253 查看
共两种方法,第一种比较全面,第二种方法比较精简(只适合中文和ANSI字符的截取)
第一种,比较全面:
function utf8SubFix($str,$start,$len){
$strlen=strlen($str);
if(!$len||$len<=0||$len<$start){
echo '参数错误';
return false;
}
if($strlen<$len){
$len=$strlen;
}
$offset=0;
$chars=0;
$res='';
while(($chars-$start)!=$len){
$high=decbin(ord(substr($str,$offset,1)));
if(strlen($high)<8){
$count=1;
}else if(strcmp($high & '11100000',11000000)==0){
$count=2;
}else if(strcmp($high & '11110000',11100000)==0){
$count=3;
}else if(strcmp($high&'11111000','11110000')==0){
$count=4;
}else if(strcmp($high&'11111100','11111000')==0){
$count=5;
}else if(strcmp($high&'11111110',11111100)==0){
$count=6;
}else{
echo "default";
echo ($high & '111100000');
echo "<br>";
}
if($start<=$chars){
$res.=substr($str,$offset,$count);
}
$chars+=1;
$offset+=$count;
//echo "<br>".$high;
}
return $res;
}
第二种,比较精简,只适合中文和ANSI字符的截取
function mixSubstr($str, $length, $start=FALSE)
{
$strlen = strlen($str);
if( $length<=0||!$length||($start >= $strlen)){
return false;
}
if($length > $strlen) {
$length = $strlen;
}
$content = '';
$sing = 0;
$count = 0;
//截取开始,中文字符占用3个字,所以从第一个开始依次判断,大于0xa0则开始截取三个字,小于则只截取一个
//只针对中文有效,或者字符占3个字的文字
while($length != ($count-$start))
{
if(ord($str[$sing]) > 0xa0) {
if(!$start || $start <= $count) {
$content .= $str[$sing].$str[$sing+1].$str[$sing+2];
}
$sing += 3;
$count++;
}else{
if(!$start || $start <= $count) {
$content .= $str[$sing];
}
$sing++;
$count++;
}
}
return $content;
}
//顺序查找(数组里查找某个元素)
function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i<$n; $i++){
if($array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{
return -1;
}
}
function binaryfind($arr, $findVal, $lindex, $rindex) {
if ($lindex <= $rindex) {
$mindex = floor(($rindex + $lindex) / 2);
} else {
return -1; //找不到,返回-1
}
if ($findVal == $arr[$mindex]) {
return $mindex;
} else if ($findVal > $arr[$mindex]) {
$lindex = $mindex + 1;
return binaryfind($arr, $findVal, $lindex, $rindex);
} else if ($findVal < $arr[$mindex]) {
$rindex = $mindex - 1;
return binaryfind($arr, $findVal, $lindex, $rindex);
}
}
第一种,比较全面:
function utf8SubFix($str,$start,$len){
$strlen=strlen($str);
if(!$len||$len<=0||$len<$start){
echo '参数错误';
return false;
}
if($strlen<$len){
$len=$strlen;
}
$offset=0;
$chars=0;
$res='';
while(($chars-$start)!=$len){
$high=decbin(ord(substr($str,$offset,1)));
if(strlen($high)<8){
$count=1;
}else if(strcmp($high & '11100000',11000000)==0){
$count=2;
}else if(strcmp($high & '11110000',11100000)==0){
$count=3;
}else if(strcmp($high&'11111000','11110000')==0){
$count=4;
}else if(strcmp($high&'11111100','11111000')==0){
$count=5;
}else if(strcmp($high&'11111110',11111100)==0){
$count=6;
}else{
echo "default";
echo ($high & '111100000');
echo "<br>";
}
if($start<=$chars){
$res.=substr($str,$offset,$count);
}
$chars+=1;
$offset+=$count;
//echo "<br>".$high;
}
return $res;
}
第二种,比较精简,只适合中文和ANSI字符的截取
function mixSubstr($str, $length, $start=FALSE)
{
$strlen = strlen($str);
if( $length<=0||!$length||($start >= $strlen)){
return false;
}
if($length > $strlen) {
$length = $strlen;
}
$content = '';
$sing = 0;
$count = 0;
//截取开始,中文字符占用3个字,所以从第一个开始依次判断,大于0xa0则开始截取三个字,小于则只截取一个
//只针对中文有效,或者字符占3个字的文字
while($length != ($count-$start))
{
if(ord($str[$sing]) > 0xa0) {
if(!$start || $start <= $count) {
$content .= $str[$sing].$str[$sing+1].$str[$sing+2];
}
$sing += 3;
$count++;
}else{
if(!$start || $start <= $count) {
$content .= $str[$sing];
}
$sing++;
$count++;
}
}
return $content;
}
//顺序查找(数组里查找某个元素)
function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i<$n; $i++){
if($array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{
return -1;
}
}
function binaryfind($arr, $findVal, $lindex, $rindex) {
if ($lindex <= $rindex) {
$mindex = floor(($rindex + $lindex) / 2);
} else {
return -1; //找不到,返回-1
}
if ($findVal == $arr[$mindex]) {
return $mindex;
} else if ($findVal > $arr[$mindex]) {
$lindex = $mindex + 1;
return binaryfind($arr, $findVal, $lindex, $rindex);
} else if ($findVal < $arr[$mindex]) {
$rindex = $mindex - 1;
return binaryfind($arr, $findVal, $lindex, $rindex);
}
}
相关文章推荐
- PHP字符串截取函数(解决中文乱码问题!支持UTF-8和GB2312)
- php 字符串操作函数substr()截取中文子串乱码问题
- 没事写了两个函数,php中gbk和utf-8中文无乱码截取
- PHP 中文字符串截取无乱码的方法以及php汉字截取函数_preg_split()
- PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数
- PHP技术分享--实现中文字串截取无乱码的函数(适用于utf-8)
- PHP的两个常用函数截取中文字符串无乱码与获取客户端IP地址
- 写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要 求字符串中的中文不能出现乱码
- PHP中文字符串截取无乱码方法,php汉字截取函数_preg_split()
- 写一个函数, 2个参数, 1个字符串, 1个字节数,返回截取的字符串,要 求字符串中的中文不能出现乱码: 如 ( “ 我ABC”, 4) 应该截为 “ 我AB”,输入( “ 我 ABC汉DEF”, 6
- 解决截取中文字符出现乱码的函数
- PHP中的字符串截取函数,取子符串,以保证中文不出现乱码
- PHP截取中文无乱码函数——cutstr
- PHP的两个常用函数截取中文字符串无乱码与获取客户端IP地址
- php截取中文字符串无乱码的函数(主函数:ord()、substr())
- 查找:链表顺序查找和有序数组二分查找
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- PHP 中文字符串截取和翻转函数
- 【数据结构】查找算法:二分查找、顺序查找
- PHP基础12-自定义函数截取中文字符串