0

検索フォームがあり、いずれかのページの本文内にある場合はキーワードを強調表示します。私が直面しているのは、大文字と小文字を区別しない問題です。ユーザーが「SearchMe」を検索すると、本文に正確な文字列「SearchMe」が含まれている場合、それが強調表示されます。しかし、ユーザーが「searchme」と書くと、関数に対して undefined offset : 1 エラーが発生し、クエリを出力して強調表示するだけで、本体内のものは削除されないため、重複していると考えてください。なぜそれが起こるのですか?どうすれば修正できますか?

function getSearchResult($str, $query, $numOfWordToAdd) {
list($before, $after) = explode($query, $str);

$before = rtrim($before);
$after  = ltrim($after);

$beforeArray = array_reverse(explode(" ", $before));
$afterArray  = explode(" ", $after);

$countBeforeArray = count($beforeArray);
$countAfterArray  = count($afterArray);

$beforeString = "";
if($countBeforeArray < $numOfWordToAdd) {
    $beforeString = implode(' ', $beforeArray);
}
else {
    for($i = 0; $i < $numOfWordToAdd; $i++) {
        $beforeString = $beforeArray[$i] . ' ' . $beforeString;
    }
}

$afterString = "";
if($countAfterArray < $numOfWordToAdd) {
    $afterString = implode(' ', $afterArray);
}
else {
    for($i = 0; $i < $numOfWordToAdd; $i++) {
        $afterString = $afterString . $afterArray[$i] . ' ';
    }
}

$string = $beforeString . ' <span class="underline"> ' . $query . ' </span> ' . ' ' . $afterString;

return $string;
}

これをどのように呼ぶか:

echo getSearchResult($result->body,$keywords,30);
4

1 に答える 1

0

正規表現をタグに含めただけでなく、それらを使用しているのでしょうか?
これはトリックを行うはずです(テストされていません):

// The 'i' flag at the end of the regexp makes the search case insensitive
$regexp = "#(" . $query . ")#i"; 
$replacement = '<span class="underline">$2</span>';

$string = preg_replace ($regexp, $replacement, $result->body)

$query に # が含まれている場合は、それらをエスケープするか、別の文字 (任意の文字が有効) を使用して正規表現を囲む必要があることに注意してください。

最初のオカレンスのみを強調表示する場合は、4 番目のパラメーターとして 1 を preg_replace に追加します。

[編集]: 言及するのを忘れました: 検索するキーワードが複数ある場合は、これ
$query = implode('|', $keywords);
を使用してください: 上記のコードで結果の文字列をクエリとして使用します。

于 2013-11-03T13:48:16.950 に答える