正規表現は、キーワードが実際に単語である限り問題ありません。リテラルの代わりに RegExp コンストラクターを使用して、変数から作成することができます。
var re= new RegExp('('+word+')', 'gi');
return s.replace(re, '<b>$1</b>');
句読点は正規表現で特別な意味を持つ傾向があるため、「キーワード」に句読点を含めることができる場合、問題が発生します。残念ながら、正規表現をサポートする他のほとんどの言語/ライブラリとは異なり、JavaScript には正規表現の句読点をエスケープする標準関数はありません。
また、すべてのブラウザーの正規表現の実装がまったく同じであることが保証されているわけではないため、どの文字をエスケープする必要があるかを正確に把握することはできません。(特に、新しいブラウザーでは新しい機能が追加される可能性があります。) また、特別ではないバックスラッシュ エスケープ文字は、実際には機能しますが、機能することが保証されていません。
したがって、あなたができる最善のことは、次のいずれかです。
- 今日一般的なブラウザで使用されている各特殊文字をキャッチしようとしています [追加: Sebastian のレシピを参照してください]
- 英数字以外はすべてバックスラッシュでエスケープします。注意: \W は非 ASCII Unicode 文字にも一致しますが、これはあまり望ましくありません。
- 検索する前に、キーワードに英数字以外が含まれていないことを確認してください
ただし、既にマークアップが含まれている HTML 内の単語を強調表示するためにこれを使用している場合は、問題が発生します。あなたの「単語」は要素名または属性値に現れるかもしれません。その場合、それを < b> で囲もうとすると壊れてしまいます。より複雑なシナリオでは、XSS セキュリティ ホールへの HTML インジェクションでさえある可能性があります。マークアップに対処する必要がある場合は、'< を分割する、より複雑なアプローチが必要になります。... >' マークアップしてから、テキストの各ストレッチを独自に処理しようとします。