在干草堆中突出显示搜索到的字符/字符串并保留大小写

时间:2018-07-12 15:44:43

标签: php regex string preg-replace

此刻,我已经编写了一个返回名称的ajax搜索程序。到目前为止,一切正常。但是,我只想用<strong>标签突出显示搜索到的字符/字符串,但要保留这种情况,因为我是从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;
}

还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

preg_quote可以避开针中可能出现的所有保留字符。