上篇贴了自己摸索的字符串顺序匹配方法 ,这里在介绍一下处理中文字符串:
将一个中文字符串分割存入数组(ps:公司领导教给我的,在这里拿出来分享了),再进行顺序匹配货的相似度
/**
* 分割字符串到数组
* @param $string 字符串
* @param int $len 几个组合为一段,默认1
* @return array
*/
function cnstr_excision($string, $len = 1)
{
$start = 0;
$strlen = mb_strlen($string); //mb_strlen()将字符串中文当作长度1来测算(strlen在utf8模式下会把中文当作长度3)
while ($strlen) {
$array[] = mb_substr($string, $start, $len, "utf8"); //将字符串中的按照“中文字符”一个一个截取出来 放进数组
$string = mb_substr($string, $len, $strlen, "utf8"); //保存上一步截取后剩余字符串
$strlen = mb_strlen($string); //测算剩余字符串长度
}
return $array;
}
中文相似度
/**
* 中文相似度
* @param $str 被对比的字符串
* @param $model 对比字符串
* @return int 按顺序匹配字数返回数字
*/
function strmatch($str,$model){
$i=0;
$j=0;
$num = 0;
$result =array(0); //空数组预先存入一个0,防止max()报错
while($i<sizeof($str)){ //$model (j)的第一个字符和$str (i)从第一个字符挨个比对
//如果相等,(1)$num++,两个字符串都移向后一位i++ j++,$num 存入数组 如果继续相等,继续(1)
if($str[$i]!=$model[$j]){ //如果不相等则$model 跳回第一个字符 j = 0 ,$str跳回 i+1-$num ,$num=0,继续比对
$j=0; //如果 不相等 $model j依旧等于0,一直停留在当前位置 $str i++ 直至相等或者跳出循环
$i+=1-$num;
$num = 0;
}else{
$j++;
$i++;
$num++;
$result[]=$num;
}
if ($num==sizeof($model)){ //如果$model已经100%相似了,则跳出循环
break;
}
}
return max($result); //返回$model在$str顺序最大相似度
}
欢迎大家指正交流,谢谢