上篇貼了自己摸索的字符串順序匹配方法 ,這裏在介紹一下處理中文字符串:
將一箇中文字符串分割存入數組(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順序最大相似度
}
歡迎大家指正交流,謝謝