突出显示 haystack 中搜索的 char/string 并保留大小写

Highlight searched char/string in haystack and keep case

目前我编写了一个 ajax 搜索,它返回的是名字。到目前为止一切正常。但是,我想简单地使用 <strong> 标记突出显示搜索到的 char/string,但保留我从 SQL:

中获取的大小写
Example:
Search Term: M
SQL result: 1. Max Mustermann, 2. Tom Maier

What I want:
<b>M</b>ax <b>M</b>uster<b>m</b>ann
Tom <b>M</b>aier

意思是,我想保留从数据库中获取的大小写,只需将标签放在字符或字符串周围即可。

这是我目前所拥有的,但这不是我想要的。如果我搜索 "m",第一个字符也是小写的,尽管它在数据库中实际上是大写的。

public function highlightKeyword($haystack, $needle)
{
    $string = mb_strtolower($haystack);
    $string = $this->mb_ucfirst($string);
    $string = preg_replace("/(".$needle.")/i", sprintf("<strong>".strtolower($needle)."</strong>"), $string);
    return $string;
}

public function mb_ucfirst($string, $encoding)
{
    $strlen = mb_strlen($string, $encoding);
    $firstChar = mb_substr($string, 0, 1, $encoding);
    $then = mb_substr($string, 1, $strlen - 1, $encoding);
    return mb_strtoupper($firstChar, $encoding) . $then;
}

还有什么想法吗?

preg_replace/i(不区分大小写的标志)和捕获组一起使用:

preg_replace('/('.preg_quote($needle).')/i', '<b></b>', $haystack);

preg_quote 用于转义针中可能出现的任何保留字符。