Регулярные выражения хороши, если ключевые слова действительно являются словами, вы можете просто использовать конструктор RegExp вместо литерала, чтобы создать его из переменной:
var re= new RegExp('('+word+')', 'gi');
return s.replace(re, '<b>$1</b>');
Трудность возникает, если в «ключевых словах» может быть пунктуация, поскольку в регулярных выражениях пунктуация имеет особое значение. К сожалению, в отличие от большинства других языков / библиотек с поддержкой регулярных выражений, в JavaScript нет стандартной функции, позволяющей избежать пунктуации для регулярных выражений.
И вы не можете быть полностью уверены, какие именно символы нужно экранировать, потому что не все браузерные реализации регулярных выражений гарантированно будут одинаковыми. (В частности, более новые браузеры могут добавлять новые функции.) И символы, не являющиеся специальными, без обратной косой черты не гарантируют, что все еще будут работать, хотя на практике это так.
Итак, самое лучшее, что вы можете сделать, это одно из:
- пытается поймать каждый специальный символ в обычном браузерном использовании сегодня [добавить: см рецепт Себастьяна]
- обратный слеш - экранирование всех не алфавитно-цифровых символов. care: \ W также будет соответствовать не-ASCII символам Юникода, которые вам не нужны.
- просто убедитесь, что в ключевом слове нет не алфавитно-цифровых символов перед поиском
Если вы используете это для выделения слов в HTML, которые уже содержат разметку, у вас возникнут проблемы. Ваше «слово» может появиться в имени элемента или значении атрибута, и в этом случае попытка обернуть вокруг него приведет к поломке. В более сложных сценариях возможно даже HTML-инъекция в дыру в безопасности XSS. Если вам нужно справиться с разметкой, вам понадобится более сложный подход, разделив разметку «<...>», прежде чем пытаться обрабатывать каждый фрагмент текста самостоятельно.