Preg replace 将搜索到的字母以粗体显示在结果中

Preg replace put searched letters in bold in result

我有一个搜索框,我希望我的结果仅在单词(姓名或姓氏)开头的字母上加粗。

例如:"Mary Kidman".

搜索:"Ma"

预期结果:“Mary Kidman”

当前结果:“Mary Kidman”

我的脚本:

function replace_accents($str) {
        $str = htmlentities($str, ENT_COMPAT, "UTF-8");
        $str = preg_replace('/&([a-zA-Z])(uml|acute|grave|circ|tilde);/','',$str);
        return html_entity_decode($str);
    }

$q = $_POST['search'];

while($row = $result->fetch_array()) {

    $id_docente = $row['id'];
    $name = $row['name'];

    $searchable_name = replace_accents($name);

    if(stripos($searchable_name, $q) !== false) {
        $final_result = preg_replace("/($q)/i", '<strong></strong>', $searchable_name);
    }

谢谢!

添加分词标记\b,像这样:

$final_result = preg_replace("/\b($q)/i", '<strong></strong>', $searchable_name);

这样,它只匹配单词的开头,例如 Mary,但不是 Kidman。

Demo:

Mary Kidman    ->  <strong>Ma</strong>ry Kidman
James Marconi  ->  James <strong>Ma</strong>rconi
Yo Yo Ma       ->  Yo Yo <strong>Ma</strong>
Ben Stillman   ->  Ben Stillman
Mark Manning   ->  <strong>Ma</strong>rk <strong>Ma</strong>nning

preg_replace的参数在主题

之后有一个限制器
$final_result = preg_replace("/($q)/i", '<strong></strong>', $searchable_name, 1);

您需要使用捕获组:

例如:

/ma/gi

匹配 Mary Kidman

其中:

/(?:^| )(ma)/gi

Mary Kidman

匹配

第一个括号是一个非捕获组,它匹配字符串的开头或 space。第二个括号是匹配字符串 ma.

的捕获组