【问题标题】:mysql & php search highlightingmysql & php 搜索高亮
【发布时间】:2012-11-27 17:37:34
【问题描述】:

想知道是否有人可以帮助我朝着正确的方向前进,我正在构建一个搜索功能(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 循环复制结果,但我想不出办法。

提前致谢

【问题讨论】:

  • 这里有什么问题?是不突出任何东西还是只突出最后一个词?
  • 基本上发生的情况是用户输入的最后一个单词突出显示,没有别的
  • 在正则表达式中插入用户字符串时,绝对应该使用 preg_quote()。
  • @flyx Nice 抬头,将其添加到我的答案中

标签: php mysql search


【解决方案1】:

在这段代码中:

//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>';
    }
}

【讨论】:

  • Awesome Dale 感谢您的帮助,很高兴有人能理解我的问题
  • @Greyhamme 没问题的冠军,这是我以前遇到过的问题。在别人的代码中更容易看到:)
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 2012-01-21
  • 2012-01-23
  • 1970-01-01
  • 2017-12-15
  • 2023-03-13
  • 2010-09-29
  • 1970-01-01
相关资源
最近更新 更多