1

検索結果の強調表示: 以下のコードを使用して、コーパス/テキスト内の単語を検索しています。コードはPHPFiddleにあります。完全な単語のみが一致します (大文字と小文字は区別されません)。すべての単語が検出されると、一致した単語が HTML アンカーaタグで囲まれます。したがって、最終的には、関数を呼び出した後にコーパスをエコーし​​、検索結果が強調表示されたコーパスを取得できます (使用する CSS によって異なります)。

function highlight($corpus, $words) {
    preg_match_all("~\w+~", $words, $m);
    if(!$m) return $corpus;
    $re = "~\\b(" . implode("|", $m[0]) . ")\\b~i";
    return preg_replace($re, "<a href='#'>$0</a>", $corpus);
}

$corpus = "Hello, world! Today is an amazing day!";
echo highlight($corpus, 'hello');

検索結果のナビゲーション: コーパスが大きい場合、強調表示だけでは検索結果を簡単に調べることができません。ユーザーは、たとえば、[次へ]/[前へ] ボタンを使用して、各試合に順番に移動できるようにしたい場合があります。これを実現するための 1 つのアイデアは、名前属性をアンカーに追加することです。つまり、

...
return preg_replace($re, "<a name='$0' href='#'>$0</a>", $corpus);
...

内部リンクを持つ個別のアンカーは、異なる一致に移動できます。たとえば、下のリンクをクリックすると、 でアンカーに移動しname='hello'ます。

<a href="#hello">Hello</a>

問題: 私が抱えている問題は、複数の一致がある可能性がある$0ため、name属性を使用しても機能しないように見えることです。JSFiddleの長いコーパスでこの例を参照してください。使用中に一意のインデックス値を取得する方法はありpreg_replaceますか? あるいは、一致した単語がコーパス内で見つかった位置を返す方法はありますか? 強調表示とナビゲーションを取得するための別のより良いアプローチがあるかもしれません。ご意見ありがとうございます

4

1 に答える 1

1

コメントで示唆されているように、これに使用できますが、インデックスを把握するpreg_replace_callbackために使用する必要はありません。strpos代わりに、呼び出されるたびにインクリメントする関数内で静的変数を使用できます。

文字列「abcabcab c」を受け​​取り、文字列「a」が出現するたびにインデックスを追加する非常に基本的な例:

$text = 'a b c a b c a b c';
$text = preg_replace_callback(
           '/a/', 
           function($matches) {
              static $i = 0;
              return $matches[0].$i++;
           }, 
           $text
        );
echo $text;

結果の出力:

a0 b c a1 b c a2 b c
于 2013-09-02T07:36:59.000 に答える