突出显示 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
用于转义针中可能出现的任何保留字符。
目前我编写了一个 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
用于转义针中可能出现的任何保留字符。