使用中文分词搜索,输入一大串字符后,搜索给出的并不是精准匹配的数据,而是对字符串拆分后匹配的数据。
所以网页搜索中,搜索引擎通常会把搜索结果命中的字符标记一个颜色,方便用户选择更匹配的结果。
一、首先写一个函数,把搜索关键字拆分成数组
函数返回的,分别是拆分后的原始数据,和拆分后加了标签的数据
/**
* 把字符串拆分成数组
* @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",
"客户合同账户登录不了 怎么处理",
];
三、替换,把匹配的字符替换成标签+字符
在这里替换数组$searchRequest是一个一维数组,可以直接传参。
如果$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 $keyWord . "\n\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);
// 正则子字符串替换,
$replaceData = str_replace($resList[0], $resList[1], $searchRequest);
echo "<pre>关键字:\n";
echo $keyWord . "\n\n";
echo "搜索结果:\n";
print_r($replaceData);