Corregir cientos de cadenas de golpe parece una tarea tranquila: se escribe el patrón, se lanza, y el guion informa de cuántas líneas cambió. El problema es lo que no informa. Un reemplazo masivo mal acotado rompe enlaces, marcadores y clases CSS sin producir un solo error, y el daño se descubre semanas después, ya en producción. Esta guía recoge las guardas que lo evitan y las comprobaciones que hay que hacer antes y después.

La misma palabra, tres significados
Supongamos que hay que corregir «automatizacion» por «automatización» en todo un sitio. Esa cadena aparece en cuatro sitios de una misma página:
- En un párrafo: hay que corregirla.
- En la dirección
/automatizacion-con-ia/: tocarla rompe el enlace y tira el posicionamiento de esa página. - En una clase CSS
ico-automatizacion: tocarla deja el icono sin estilo. - En un ancla
#automatizacion: tocarla rompe el salto interno.
Un str_replace a secas cambia las cuatro. Y ninguna de las tres roturas produce un error: la página sigue cargando, el enlace lleva a un 404 y la clase simplemente no aplica.
La solución: guardas asimétricas
La forma práctica de distinguir prosa de identificador es mirar qué hay alrededor de la palabra. Delante de una ruta siempre hay una barra, un guion o un guion bajo; delante de una palabra en una frase hay un espacio o un signo de puntuación.
antes = (?<![\w0-9\-/_#=?&.:@]) # ni letra, ni / - _ # = ? & . : @
detras = (?![\w0-9\-/_=?&]) # el punto SÍ se permite
Son asimétricas a propósito. Por delante se bloquea el punto, porque archivo.automatizacion es un identificador. Por detrás se permite, porque «mejora la automatizacion.» es el final de una frase y hay que corregirla.
Las cadenas que el patrón nunca ve
Hay dos familias que se escapan de forma sistemática, y lo peor es que no se nota: el guion informa de las líneas que cambió, nunca de las que no llegó a mirar.
Las comillas dobles
Si el patrón busca cadenas entre comillas simples, todo lo escrito entre comillas dobles queda fuera. Es muy habitual: las cadenas con saltos de línea se escriben entre comillas dobles por necesidad, así que precisamente las listas y los textos largos —lo que más se lee— pueden sobrevivir intactos a varias pasadas seguidas.
Las palabras pegadas a un salto de línea
Esta es más sutil. En el archivo fuente, un salto de línea dentro de una cadena son dos caracteres: la barra y la letra n. Esa n cuenta como letra, así que la palabra que va justo detrás parece la continuación de otra palabra y no encaja con el patrón:
"…seguridad\nAuditoria de infraestructura"
↑ "Auditoria" nunca se corrige
La salida es apartar los escapes antes de buscar y devolverlos al final, cambiándolos por un carácter que no sea una letra.
Comprobar el resultado, no el proceso
Que el guion diga «147 líneas corregidas» no significa que las corrigiera bien. Es el mismo engaño que deja pasar los errores que solo aparecen en la siguiente visita: el proceso informa de que terminó, no de que acertara. Tres comprobaciones que sí valen:
- Antes de escribir nada, mostrar los fragmentos que van a cambiar, con unos 40 caracteres de contexto a cada lado. En un vistazo se ve si una dirección se ha colado en la lista.
- Después, verificar la integridad. Si el archivo es JSON o similar, volver a parsearlo y comparar el número de elementos con los que tenía. Si no cuadra, se descarta ese archivo en vez de guardarlo roto.
- Guardar copia antes de escribir, y si el destino es una base de datos, guardarla al lado del valor original.
Las palabras que no se pueden automatizar
Algunas decisiones no dependen de la palabra sino de la frase, y ningún diccionario de palabras sueltas las resuelve. En español son un clásico:
- publica (verbo) frente a pública (adjetivo)
- esta frente a está
- que frente a qué
Una regla automática convierte «cada color se publica como variable CSS» en «se pública»: correcta para la regla, mal en la frase. Estas van en una lista de frases completas, no de palabras.
El efecto lateral que compensa
Revisar las cadenas una a una tiene un premio inesperado: saca a la luz las erratas del original. Al preparar un reemplazo o una traducción suelen aparecer faltas que llevaban meses publicadas y que nadie había visto, además de marcadores que un reemplazo anterior rompió sin dar error.
Merece la pena arreglar el origen antes de propagarlo. Traducir una errata la multiplica por el número de idiomas.
Y conviene comprobar que las traducciones se aplican de verdad antes de dar la tarea por cerrada, porque ese es otro sitio donde el fallo no avisa: un archivo de idioma mal nombrado se carga sin protestar y deja todo el texto en el idioma de partida.
Preguntas frecuentes
¿Por qué un buscar-y-reemplazar puede romper un enlace?
Porque la misma palabra aparece en sitios con reglas distintas. «automatizacion» en un párrafo es texto que hay que corregir; dentro de /automatizacion-con-ia/ es la dirección de la página, y cambiarla rompe el enlace y tira el posicionamiento de esa URL. Un reemplazo sin guardas no distingue: cambia las dos.
¿Cómo se protegen las rutas y los identificadores?
Con guardas asimétricas alrededor del patrón. Por delante se bloquea todo lo que indica ruta o parámetro (barra, guion, guion bajo, almohadilla, igual, interrogación, punto, arroba); por detrás se permite el punto, para no perder las palabras que terminan una frase. Así /mi-pagina/ y #ancla quedan intactos y «la operación.» sí se corrige.
¿Por qué algunas cadenas no se corrigen aunque el patrón parezca bien?
Dos causas habituales. La primera: el patrón solo mira las cadenas entre comillas simples y las que están entre comillas dobles se quedan fuera. La segunda, más difícil de ver: en el archivo fuente un salto de línea son dos caracteres, la barra y una n, y esa n cuenta como letra, así que la palabra pegada detrás nunca encaja con el patrón.
¿Por qué al buscar en la base de datos parece que el cambio no se aplicó?
Porque el cotejo por defecto de MySQL ignora las tildes. Buscar LIKE '%operacion%' encuentra también «operación», así que parece que quedan sin corregir cadenas que ya están bien. Hay que usar LIKE BINARY para que la comparación distinga.
¿Qué comprobación hay que hacer antes de lanzar el reemplazo?
Mostrar los fragmentos que van a cambiar con su contexto —unos 40 caracteres a cada lado— antes de escribir nada. En un vistazo se ve si un enlace o una clase CSS se ha colado en la lista. Y después, si el archivo es JSON o similar, volver a parsearlo y comparar el número de elementos: si no cuadra, se descarta ese archivo en lugar de guardarlo roto.
