使用中文分词搜索,输入一大串字符后,搜索给出的并不是精准匹配的数据,而是对字符串拆分后匹配的数据。
所有网页搜索中,搜索引擎通常会把搜索结果命中的字符标记一个颜色,方便用户选择更匹配的结果。
一、首先写一个函数,把搜索关键字拆分成数组
函数返回的数据,分别是拆分后的原始数据,和拆分后加了标签的数据
/**
* 把字符串拆分成数组
* @param $search 搜索关键字
* @return array
*/
function splitString(string $search):array
{
// 正则匹配,汉字按单字拆分,英文按单词拆分并且位数不少于2位,数字按连续性拆分并且位数不少于2位
preg_match_all('/([a-zA-Z]){2,}/', $search, $matchesWord);
preg_match_all('/([\d]){2,}/', $search, $matchesNumber);
preg_match_all("/[\x{4e00}-\x{9fa5}]/u", $search, $matchesCN);
$originalArr = $newArr = [];
if (!empty($matchesWord[0])) {
$originalArr = array_merge($originalArr, $matchesWord[0]);
}
if (!empty($matchesNumber[0])) {
$originalArr = array_merge($originalArr, $matchesNumber[0]);
}
if (!empty($matchesCN[0])) {
$originalArr = array_merge($originalArr, $matchesCN[0]);
}
// 添加<font></font>标签
foreach ($originalArr as $value) {
$newArr[] = sprintf("<font color='red'>%s</font>", $value);
}
return [$originalArr, $newArr];
}
二、搜索关键字和搜索结果
$keyWord = '客户合同账户登录不了 怎么处理';
$searchRequest = [
"这个客户售后搜索不到",
"这个客户是做个人至尊服务被录成个人VIP?",
"有什么办法更有效知道合同过期的学员?",
"管理后台怎么查询合作到期的客户?",
"麻烦查一下CRM这个客户登录账号",
"这个客户 之前在商城老系统办过合同",
"麻烦移动一下到我商城的老系统,我的账号是xx",
"客户合同账户登录不了 怎么处理",
];
三、标记命中的字符
在这里替换数组searchReques是二维码数组,那么就要用foreach()循环处理了。
$resList = splitString($keyWord);
// 正则子字符串替换,
//str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] ) : mixed
$replaceData = str_replace($resList[0], $resList[1], $searchRequest);
四、标记完毕了,打印一下搜索关键字和搜索结果的命中吧
echo "<pre>关键字:\n";
echo $keyWord . "\n\n";
echo "搜索结果:\n";
print_r($replaceData);
最终样式:
完整代码
<?php
/**
* 把字符串拆分成数组
* @param $search 搜索关键字
* @return array
*/
function splitString(string $search):array
{
// 正则匹配,汉字按单字拆分,英文按单词拆分并且位数不少于2位,数字按连续性拆分并且位数不少于2位
preg_match_all('/([a-zA-Z]){2,}/', $search, $matchesWord);
preg_match_all('/([\d]){2,}/', $search, $matchesNumber);
preg_match_all("/[\x{4e00}-\x{9fa5}]/u", $search, $matchesCN);
$originalArr = $newArr = [];
if (!empty($matchesWord[0])) {
$originalArr = array_merge($originalArr, $matchesWord[0]);
}
if (!empty($matchesNumber[0])) {
$originalArr = array_merge($originalArr, $matchesNumber[0]);
}
if (!empty($matchesCN[0])) {
$originalArr = array_merge($originalArr, $matchesCN[0]);
}
// 添加<font></font>标签
foreach ($originalArr as $value) {
$newArr[] = sprintf("<font color='red'>%s</font>", $value);
}
return [$originalArr, $newArr];
}
$keyWord = '客户合同账户登录不了 怎么处理';
$searchRequest = [
"这个客户售后搜索不到",
"这个客户是做个人至尊服务被录成个人VIP?",
"有什么办法更有效知道合同过期的学员?",
"管理后台怎么查询合作到期的客户?",
"麻烦查一下CRM这个客户登录账号",
"这个客户 之前在商城老系统办过合同",
"麻烦移动一下到我商城的老系统,我的账号是xx",
"客户合同账户登录不了 怎么处理",
];
$resList = splitString($keyWord);
// 正则子字符串替换,
//str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] ) : mixed
$replaceData = str_replace($resList[0], $resList[1], $searchRequest);
echo "<pre>关键字:\n";
echo $keyWord . "\n\n";
echo "搜索结果:\n";
print_r($replaceData);
来源:CSDN
作者:一筐大白菜啊
链接:https://blog.csdn.net/sphinx1122/article/details/104815371