0

Web サイトの検索ボックスに入力された用語に基づいて、データベースで検索を実行する PHP スクリプトがあります。これは、テキストのブロックを返します。今の私の検索用語が であるとしましょう"test block"。私の結果の例は、次のテキスト ブロックです。

これは、検索クエリを使用してデータベースから収集されたテキストのテスト ブロックです。

さて、私の質問は、テキスト ブロック内の検索用語を「強調表示」して、ユーザーがこの結果が最初に取得された理由を確認できるようにする方法です。上記の例を使用すると、次のようなもので十分です。

これは、検索クエリからデータベースから収集されたテキストのテスト ブロックです。

これまでにテキストを変更するいくつかのことを試しましたが、実際に遭遇した問題は大文字と小文字の区別に関係しています。たとえば、次のコードを使用した場合:

$exploded = explode(' ', $search_terms);
foreach($exploded as $word) {
    // I have to use str_ireplace so the word is actually found
    $result = str_ireplace($word, '<b>' . $word . '</b>', $result);
}

それは私$resultbold言葉のあらゆる例を通り抜けます。検索結果の 2 番目の例で望んでいたように、これは正しいように見えます。ただし、ユーザーが の"Test Block"代わりに使用する場合"test block"、検索用語は大文字になり、次のように表示されます。

これは、検索クエリからデータベースから収集されたテキストのテスト ブロックです。

これは、特にユーザーが小文字の検索用語を使用していて、それらがたまたま文の先頭にある場合には機能しません。

基本的に、私がする必要があるのは、文字列内の単語を見つけ、単語の<b>直前にテキスト (この例では) を挿入</b>し、単語自体が置き換えられないようにしながら、単語の直後 (この例では) にテキストを挿入することです。 . これがルールpreg_replaceであり、str_replace私は信じているので、何をすべきか本当に行き詰まっています。

どんなリードも大歓迎です。

4

4 に答える 4

2
$exploded = explode(' ', $search_terms);
foreach($exploded as $word) {
    // I have to use str_ireplace so the word is actually found
    $result = preg_replace("/(".preg_quote($word).")/i", "<b>$1</b>", $result);
}

パターン マッチングhttp://www.php.net/manual/en/reference.pcre.pattern.syntax.phpは、 のような特定の文字を使用します。[ ] / * + など..これらがパターンで発生する場合は、最初にエスケープする必要がありますpre_quote();

パターンは、パターンを識別するために区切り文字で開始および終了します http://www.php.net/manual/en/regexp.reference.delimiters.php

私の修飾子に従いましたhttp://www.php.net/manual/en/reference.pcre.pattern.modifiers.php この場合、i は大文字と小文字を区別しません

(角かっこ) 内のものは、後で使用するためにキャプチャされ、 $matched パラメーターで、または最初の $1 または \\1 として置換され、$2 秒などで使用されます。

于 2013-03-15T16:43:12.613 に答える
1

を使用しpreg_replaceます。あなたの例では

$result = preg_replace("/\\b(" . preg_quote($word) . ")\\b/i", '<b>$1</b>', $result);
于 2013-03-15T16:42:59.820 に答える
0
$string = 'The quick brown fox jumped over the lazy dog.';
$search = "brown";
$pattern = "/".$search."/";
$replacement = "<strong>".$search."</strong>";
echo preg_replace($pattern, $replacement, $string);

速い茶色のキツネは怠け者の犬を飛び越えた

于 2013-03-15T16:45:13.117 に答える
0

preg_replace を使用できます。

foreach ($exploded as $word) {
    $text = preg_replace("`(" . preg_quote($word) . ")`Ui" , "<b>$1</b>" , $text);
}
于 2013-03-15T16:42:39.767 に答える