在utf-8编码下实现字符串截取,一个汉字长度为1,一个英文字母、数字长度为0.5的实现;

1、在百度搜索框中输入:中困要要要要乱说乱动器在要困要要要在要无误仙客来要是要要粉黛将军肚要呆要要因要两手空空在 要手榴弹要要在顺在手榴弹要在右要要要要,最终搜索结果如下图:

提示:”要两手” 及其后面的字词均被忽略,因为百度的查询限制在38个汉字以内。

2、编写函数qstrlen,代码如下:

/**
* dstrlen  // kcuc
* @param string $str
* @return string $count 一个汉字表示两个长度
*/
function qstrlen($str) {
$count = 0;
$len = 0;
for ($i = 0; $i < strlen($str); $i++) {
$value = ord($str[$i]);
if($value > 127) {
$count++;
if ($value >= 192 && $value <= 223) {
$i++;
} elseif ($value >= 224 && $value <= 239) {
$i = $i + 2;
} elseif ($value >= 240 && $value <= 247) {
$i = $i + 3;
}
}

$count++;

if ($count > 76 && $len == 0) {
$len = $i;
$subject = mb_strcut($str, 0, $len, ‘utf-8’);
}

if ($count > 82) {
return [$subject, str_replace($subject, ”, mb_strcut($str, 0, $i, ‘utf-8’))];
break;
}
}
if ($count > 76 && $count <= 82) {
return [$subject, str_replace($subject, ”, mb_strcut($str, 0, null, ‘utf-8’))];
}
return $count;
}

3、代码截图如下(一个汉字表示2个长度,因此38需要乘以2,且“要两手”为3个汉字的长度,因此在函数中长度为6):

代码截图如下(一个汉字表示2个长度,因此38需要乘以2,且“要两手”为3个汉字的长度,因此在函数中长度为6)

4、调用截取字符串函数,其代码及截图如下:

function qstrlen,如果长度小于38个汉字,则返回字符串长,否则返回数组;

5、在网页模板中判断并显示提示信息:

在网页模板中判断并显示提示信息

6、最终搜索关键词如果长度超出38个汉字,显示效果如下:

最终搜索关键词如果长度超出38个汉字,显示效果如下

7、中英文加数字混合关键词搜索效果与百度对比,搜索:中困要要要要乱说乱动器8d88847yudghdjuhfhryhw27在要困要要要ssssssssss在要无误仙客shjdjssdddd来要是要要粉黛将军肚要呆要要因,结果如下:

百度的3个汉字的提示信息,其长度并非严格的3个汉字的长度;

中英文加数字混合关键词搜索效果与百度对比,搜索:中困要要要要乱说乱动器8d88847yudghdjuhfhryhw27在要困要要要ssssssssss在要无误仙客shjdjssdddd来要是要要粉黛将军肚要呆要要因,结果如下

 

永夜