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

时间:2015-01-05 06:20:47

标签: php

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

例如:“Mary Kidman”。

搜索:“Ma”

预期结果:“ Ma ry Kidman”

目前的结果:“ Ma ry Kid ma n”

我的剧本:

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);
    }

谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

这样,它只匹配一个单词的开头,比如 Ma ry,而不是基德曼。

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

答案 1 :(得分:0)

您需要使用捕获组:

例如:

/ma/gi

匹配 Ma ry Kid ma n

其中:

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

匹配 Ma ry Kidman

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

答案 2 :(得分:-1)

preg_replace的参数在主题

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