- ベストアンサー
PHP検索文字列ハイライト表示の方法
- phpの検索処理で、検索キーワードにマッチした文字列を強調表示(<strong>)する方法を教えてください。
- 現在、検索前にタグをエスケープして表示していますが、キーワードが含まれる場合にタグまでエスケープされてしまいます。
- 効果的な解決方法があれば教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>キーワードの数分いただいた方法をループ処理しようとしましたが それは間違っています。キーワードはいくつあろうがループは一回です。正規表現の「|」を使えばいいだけですよ。orです。ご存知ありませんか? preg_replaceでも同じなんですけどね。もしかするとpreg_replaceのときもキーワードの数だけループしてたんですか?それは無駄ですよ。 PHP: 選択肢 - Manua http://jp2.php.net/manual/ja/regexp.reference.alternation.php また、もしもキーワードに正規表現のメタ文字が含まれる場合には、その文字をエスケープする必要はあるでしょうけど、そこは大丈夫ですかね。 PHP: メタ文字 - Manual http://jp2.php.net/manual/ja/regexp.reference.meta.php
その他の回答 (2)
- pringlez
- ベストアンサー率36% (598/1630)
そうですね。No.1の説明は少しおかしいですね。すみません。忘れてください。 では私が過去に実際に行った実装の例を挙げます。 (0)変換済み文字列は空文字「""」 (1)被検索文字列「<a href="test">tes;t</a>」をキーワード「;」で検索 (2)ヒットしなかったら、被検索文字列を変換済み文字列に追加して終了 (3)ヒットしたら分割「<a href="test">tes」「;」「t</a>」 (4)ヒットした部分の前の文字列をエスケープ「<a href="test">tes」 変換済み文字列に追加 (5)ヒットした部分のタグ付け「<strong>;</strong>」 変換済み文字列に追加 (6)ヒットした部分の後ろの文字列「t</a>」を被検索文字列として(1)の処理から 私が実装したのは別の言語でしたが、これならPHP実装できるはず。いうまでもないことかもしれませんがこのときの検索はグローバルオプションはいりません。 preg_replaceで一発で全体を変換する方法に比べるとずいぶん冗長ですが、実際に実装してみると、全体文字列の量とマシンの処理能力によりますが、認識できるほどの処理遅延は発生しないと思います。
補足
ご回答ありがとうございます。 検索キーワードが「; ”tes」のようにスペース区切りで複数のキーワードで検索できるようにしたいです。 なので、キーワードが1つだけならいただいた方法でうまくいけそうですが、複数キーワードになると難しそうです。(キーワードの数分いただいた方法をループ処理しようとしましたが、1つ目のキーワードの処理(4)のタイミングでエスケープされてしまうため)。 複数キーワードについて最初に記載するべきでした、申し訳ございません。
- pringlez
- ベストアンサー率36% (598/1630)
>検索したとき、該当文字列に<strong>タグをつけた後にエスケープすると ><strong>タグまでエスケープ >検索前にエスケープしてしまうとキーワード「;」で検索した時に >全てのタグ文字の後に強調された「;」が表示されてしまいます。 問題はそれだけですか?それだけだったら簡単なはずなのですが… (1) 検索 (2) タグ付け (3) あなたはこの(1)と(3)のタイミングでのエスケープしか試していないのです。 (2)でエスケープすればいいだけのことです。
補足
ご回答ありがとうございます。 「<a href="test">tes;t</a>」を「;」で検索した場合 「<a href="test">tes;t</a>」をエスケープしたら 「<a href="test">tes;t</a>」 になりますが、エスケープ前の文字列の「;」(tes;tの;)のみ判別するのは難しいと思いますがいかがでしょうか。(<の;までreplaceされてしまいます)キーワードを強調表示にする処理はpreg_replaceを使用して、キーワードの文字列を<strong>で囲むようにしていますが、別の方法があるのでしょうか? よろしくお願いします。
お礼
ありがとうございます。教えていただいたやり方で実装することができました。 有難うございました。