Realmente eso seria solo para articulos con variaciones casi sinonimos porque ningun sistema automatico te podria reemplazar "carro", "coche" y "auto" por "automovil" a menos que las variaciones estuvieran ingresadas.
Yo se que el objetivo de este tema no era saber si preg_match es adecuado para el tipo de aplicacion que se utiliza o no.
Recuerdo cuando trabajaba en el CMS de SNET implementamos las friendly URLs.. y se desarrolló un sistema de auto-corrección bien interesante.
La idea general era que el usuario pudiera escribir la URL amigable segun se acordaba. Así si escribía
http://www.snet.gob.sv/volcanologia el gestor lograra identificar "volcalonolgia" y convertirla inmediatamente a la palabra correcta del diccionario, en este caso "vulcanologia".
No quise utilizar preg_match ya que es un gestor de contenido dinámico entonces es prácticamente imposible tener actualizado un catálogo de sinónimos o palabras similares. Y no podría detectar cosas como estas:
http://www.snet.gob.sv/ver/megeotorigia -> te muestra el contenido de
http://www.snet.gob.sv/ver/mteorologiaLo que se hace es bastante simple y ayuda mucho que todas las páginas tienen un orden jerarquico. Para cada nodo del arbol cada una de las ramas (paginas internas) almacena su nombre.
Para comparar utilizo esta funcion:
LevenshteinQue te calcula el numero de "transformaciones" necesarias para convertir una palabra en otra.
Luego se hace una comparacion de cual palabra es la que mas se asemeja (en este caso la que necesite menos transformaciones) y se realiza la redireccion. Obviamente no es perfecto, pero trabaja absurdamente rápido, no hay que tener una lista de palabras similares y es completamente transparente para el usuario.
Tambien hay otra funcion llamada
Soundex para PHP pero es un algoritmo de comparacion fonética así que no aplicaba para nuestro caso ya que buscaria similitudes en pronunciación en ingles para palabras en español.
Otra funcion en php util para este tipo de busquedas es "
similar_text". Te recomiendo que le des una revisada a la documentación de estas funciones para ver las ventajas y desventajas de cada uno.
Realmente las funciones de expresiones regulares son bastante útiles cuando sabes exactamente que es lo que estas buscando o que queres reemplazar, o cuando tu entrada es "regular". Pero cuando no sabes exactamente que es tu entrada de datos usar regexp te puede dar mas dolores de cabeza que soluciones.

P.D.: Si te fijas la solucion implementada al final es una mezcla de busquedas en SQL y filtrado en PHP. No es algo que haga completamente el gestor ni tampoco completamente PHP

. Lastima que no estoy en SNET pero bien se podrìa implementar un "cache" de errores comunes. Asi cada palabra mal escrita se almacena en la DB con su correspondiente correccion y así luego revisas primero si ya se resolvio y sino aplicar el algoritmo de busqueda difusa, con lo que reducirias considerablemente la cantidad de consultas a la DB.. y procesamiento del lado de PHP.