MySQL和PHP搜索高亮

3

我希望有人能够给我一个正确方向的推动,我正在构建一个搜索功能(PHP和MySQL),它将显示搜索结果并突出显示用户搜索的关键字。目前,我获取了用户输入的搜索条件,并查询数据库以获得所需的结果,这方面已经很好用了。但是问题在于:

$highlight = preg_replace("/".$_GET['criteria']."/", "<span class='highlight'>".$_GET['criteria']."</span>", $_row['name']); 

这只会突出显示一个短语,而不是单个关键字。例如,如果文档名为“Hello world”,用户输入完全相同的内容,则可以轻松突出显示;但是,如果用户输入“world hello”,则不会突出显示任何内容。我认为,将搜索条件使用explode分割成每个单词并逐个检查似乎是一个好主意,但这似乎也失败了。以下是我的查询和结果显示方式:

    $sql = "SELECT *
                FROM uploaded_documents
                WHERE dept_cat = 'procedures'
                AND cat =:cat 
                AND keywords REGEXP :term ";
    $result->execute(array(':cat' => $_GET['category'],':term' => $_GET['criteria']));

 //display results
 while($row = $stmt->fetch()){
    $explode_criteria = explode(" ",$_GET['criteria']);             
    foreach($explode_criteria as $key){                             
        $highlight = preg_replace("/".$key."/", "<span class='highlight'>".$key."</span>", $row['name']); 

            echo '<td><a target="_blank" href="'.$row['url'].'">'.$highlight.'</a></td>';   
                    echo '<td>'.$row['version'].'</td>';
                    echo '<td>'.$row['cat'].'</td>';
                    echo '<td>'.$row['author'].'</td>'; 

                    echo '<td>'.$row['added'].'</td>';  
                    echo '<td>'.$row['auth_dept'].'</td>';  

                    echo '<td>';
    } 
}

为了简洁起见,我省略了代码并尽量减少了篇幅。我一直在尝试基于以下帖子进行工作:highlighting search results in php/mysql
我认为我的第一个问题是while循环中的foreach循环会导致结果重复,但我想不出解决方法。
提前感谢您的帮助。

这里的问题是什么?它没有突出显示任何内容还是只突出显示最后一个单词? - Dale
基本上发生的是用户输入的最后一个单词会被突出显示,而其他内容则不会。 - Greyhamne
1
在正则表达式中插入用户字符串时,一定要使用 preg_quote()。 - flyx
@flyx,非常感谢你的提醒,我已经将它添加到我的答案中了。 - Dale
1个回答

2
在这段代码中:
//display results
while ($row = $stmt->fetch())
{
    $explode_criteria = explode(" ", $_GET['criteria']);
    foreach ($explode_criteria as $key)
    {
        $highlight = preg_replace("/" . $key . "/", "<span class='highlight'>" . $key . "</span>", $row['name']);

        echo '<td><a target="_blank" href="' . $row['url'] . '">' . $highlight . '</a></td>';
        echo '<td>' . $row['version'] . '</td>';
        echo '<td>' . $row['cat'] . '</td>';
        echo '<td>' . $row['author'] . '</td>';

        echo '<td>' . $row['added'] . '</td>';
        echo '<td>' . $row['auth_dept'] . '</td>';

        echo '<td>';
    }
}

这个循环不断地引用$row['name'],因此替换是完成的,但下次循环发生时,它会替换原始未修改的$row['name']上的下一个单词。

我认为这会对您有所帮助:

//display results
while ($row = $stmt->fetch())
{
    $explode_criteria = explode(" ", $_GET['criteria']);
    $highlight = $row['name']; // capture $row['name'] here
    foreach ($explode_criteria as $key)
    {
        // escape the user input
        $key2 = preg_quote($key, '/');
        // keep affecting $highlight
        $highlight = preg_replace("/" . $key2 . "/", "<span class='highlight'>" . $key . "</span>", $highlight);

        echo '<td><a target="_blank" href="' . $row['url'] . '">' . $highlight . '</a></td>';
        echo '<td>' . $row['version'] . '</td>';
        echo '<td>' . $row['cat'] . '</td>';
        echo '<td>' . $row['author'] . '</td>';

        echo '<td>' . $row['added'] . '</td>';
        echo '<td>' . $row['auth_dept'] . '</td>';

        echo '<td>';
    }
}

2
太棒了 Dale,感谢你的帮助,很高兴有人能理解我的问题。 - Greyhamne
1
@Greyhamme 没问题,冠军,这是我以前遇到过的问题。在别人的代码中更容易看到 :) - Dale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接