Las expresiones regulares son bien siempre y cuando las palabras clave son realmente palabras, sólo puede utilizar un constructor RegExp en lugar de un literal para crear uno de una variable:
var re= new RegExp('('+word+')', 'gi');
return s.replace(re, '<b>$1</b>');
La dificultad surge si 'palabras clave 'puede tener signos de puntuación, ya que la puntuación tiende a tener un significado especial en las expresiones regulares. Desafortunadamente, a diferencia de la mayoría de los otros lenguajes/bibliotecas con compatibilidad con expresiones regulares, no existe una función estándar para evitar la puntuación de las expresiones regulares en JavaScript.
Y no puede estar completamente seguro de qué caracteres necesitan escaparse, ya que no todas las implementaciones del navegador de expresiones regulares están garantizadas para ser exactamente iguales. (En particular, los navegadores más nuevos pueden agregar nuevas funcionalidades). Y los caracteres que escapan de la barra invertida que no son especiales no se garantiza que funcionen todavía, aunque en la práctica sí lo hace.
Así que lo mejor que puede hacer es uno de:
- intentar coger cada carácter especial en el uso común del navegador de hoy [Añadir: véase la receta de Sebastian]
- barra invertida-escapar de todos los no-alfanuméricos. care: \ W también coincidirá con caracteres Unicode no ASCII, que realmente no desea.
- Sólo hay que asegurarse de que no existen los no alfanuméricos en la palabra clave antes de buscar
Si está usando este para resaltar las palabras en HTML que ya tiene marcado en, problema, sin embargo, lo que tienes. Su 'palabra' puede aparecer en un nombre de elemento o valor de atributo, en cuyo caso intentar envolver un < b> alrededor causará daños. En escenarios más complicados, posiblemente incluso una inyección HTML al agujero de seguridad XSS. Si tiene que lidiar con el marcado, necesitará un enfoque más complicado, dividiendo el marcado '< ...>' antes de intentar procesar cada tramo de texto por sí mismo.
No creo que el ejemplo funciona. – tvanfosson
Veo, solo se reemplaza la primera ocurrencia. No sabía que reemplazar se comporta así. El preg_quote es importante si quiere resaltar cadenas con/o * u otros caracteres de expresiones regulares. – okoman
Um .. it * is * javascript. Acabo de decir que hay una función en PHP llamada preg_quote. Luego incluí una versión js de esa función y una función js ... estos ejemplos de código * son * js – okoman