выделение поиска в mysql и php


Задаваясь вопросом, может ли кто-нибудь помочь мне подтолкнуть в правильном направлении, я создаю функцию поиска (php и mysql), которая будет отображать результаты поиска и выделять ключевые слова, которые искал пользователь. в данный момент я беру критерии поиска, введенные пользователем, и запрашиваю их в базе данных, которая отлично работает, чтобы получить желаемые результаты. проблема, с которой я столкнулся, заключается в

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

При этом будет выделена только фраза, а не отдельные ключевые слова. так, например, если документ назывался "Привет, мир", и пользователь набрал именно это, он не выделит никаких проблем, однако, если пользователь наберет "привет, мир", он ничего не выделит. Я подумал, что было бы неплохо взять критерии поиска и использовать 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>';
    } 
}

Ради длины я опустил здесь код и постарался свести его к минимуму, я пытался основывать свою работу на следующий пост

Выделение результатов поиска в php/mysql

Я думаю, что моя первая проблема - это цикл foreach в цикле while, дублирующий результаты, но я не могу придумать, как это обойти.

Заранее благодарю

Author: Community, 2012-12-10

1 answers

В этом блоке кода:

//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
Author: Dale, 2012-12-10 10:23:14