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


Preg replace put searched letters in bold in result

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

例如:"玛丽基德曼"。

搜索:"妈"

预期成果:"里基德曼"

当前结果:"Mary Kidman"

我的脚本:

function replace_accents($str) {
        $str = htmlentities($str, ENT_COMPAT, "UTF-8");
        $str = preg_replace('/&([a-zA-Z])(uml|acute|grave|circ|tilde);/','$1',$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>$1</strong>', $searchable_name);
    }

谢谢!

添加分词标记 'b ,如下所示:

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

这样,它只在单词的开头匹配,比如瑞,而不是基德曼。

演示

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

需要使用捕获组:

例如:

/ma/gi

饰演 瑞小子

其中:

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

饰演马里基德曼

第一个偏执是一个非捕获组,它匹配字符串的开头或空格。第二个偏执是与字符串 ma 匹配的捕获组。

preg_replace 的参数在主题之后有一个限制器

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