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

長さのために、ここではコードを省略し、最小限に抑えようとしました。次の投稿に基づいて作業を行っています。

php/mysqlで検索結果を強調表示する

私の最初の問題は、whileループの結果を複製するforeachループだと思いますが、それを回避する方法を考えることはできません。

前もって感謝します

4

1 に答える 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>';
    }
}
于 2012-12-10T10:16:46.890 に答える