原因是这样的,公司在做搜索时,比如文件名搜索,要求后端在返回时把文件名上能匹配到的文字加上标签。
    比如,搜索haha,如果返回的文件名是haha123.jpg,那么后端返回时就为hahabb123.jpg

    这个操作其实php有函数能处理:

    1. $searchName = "haha";
    2. $fileName = "hahabb123.jpg";
    3. $formatKeywords = htmlspecialchars($searchName);
    4. $FileName = str_replace("{$searchName}", "<highlight>{$formatKeywords}</highlight>", $fileName);

    但这种又有新的问题,虽然能批量处理,但客户想要的是我搜索Haha,也能匹配。其实mysql在搜索时是不区分大小写的。但 str_replace 区分大小写。当然也可以用 str_ireplace 不区分大小写,但如果客户搜索HaHA,通过str_ireplace 操作后返回的就是HaHAbb123.jpg,这显然也有问题。
    那么要满足这个需求,就得另写方法了。
    通过一系列搜索,主要参考这些文章:
    https://www.yuque.com/darry/php/fpglfk
    https://www.yuque.com/darry/php/drcs1g
    https://www.yuque.com/darry/php/vxr0da
    最终完成代码如下:

    1. <?php
    2. $str1 = "we你";
    3. $str = "wE你EWhaWE你ha你wwe你好We你C谙WeheatwE你.jpg";
    4. echo replaceHighlightTxt($str, $str1, "strong");
    5. /**
    6. * 给一个字符串中查找到的字符串加标签
    7. * @author darry
    8. * @datetime 2021/3/22 17:49
    9. * @param string $string
    10. * @param string $search
    11. * @param string $tag
    12. * @return string
    13. */
    14. function replaceHighlightTxt(string $string = "", string $search = "", string $tag = "highlight"): string
    15. {
    16. $resStr = $string;
    17. $posArr = getCharPos2($string, $search);
    18. if (empty($posArr)) {
    19. return $resStr;
    20. }
    21. $firstTag = "<" . $tag . ">";
    22. $endTag = "</" . $tag . ">";
    23. $firstTagLen = strlen($firstTag);
    24. $endTagLen = strlen($endTag);
    25. $len = strlen($search);
    26. $i = 0;
    27. foreach ($posArr as $index) {
    28. $firstIndex = $index + $i * ($firstTagLen + $endTagLen);
    29. $resStr = substr_replace($resStr, $firstTag, $firstIndex, 0);
    30. $endIndex = $firstIndex + $firstTagLen + $len;
    31. $resStr = substr_replace($resStr, $endTag, $endIndex, 0);
    32. $i++;
    33. }
    34. return $resStr;
    35. }
    36. /**
    37. * 获取一字符串在另一字符串中所有位置
    38. * @param string $str
    39. * @param string $char
    40. * @return array
    41. * @author darry
    42. * @datetime 2021/3/22 15:01
    43. */
    44. function getCharPos2(string $str, string $char): array
    45. {
    46. $j = 0;
    47. $arr = [];
    48. //全转成小写,来达到不区分大小写的目的
    49. $checkStr = strtolower($str);
    50. $checkChar = strtolower($char);
    51. //一个字符串在另一个字符串中出现的次数
    52. $count = substr_count($checkStr, $checkChar);
    53. for ($i = 0; $i < $count; $i++) {
    54. $j = strpos($checkStr, $checkChar, $j);
    55. $arr[] = $j;
    56. $j = $j + 1;
    57. }
    58. return $arr;
    59. }

    结果如下:
    image.png
    image.png