【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",
    "客户合同账户登录不了 怎么处理",
];

三、替换,把匹配的字符替换成标签+字符

在这里替换数组$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);

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值