Herramienta para reemplazar texto

Reemplazando texto en varios documentos con PHP

Esto es una herramienta para reemplazar texto en uno o más archivos de texto plano. Uso la misma estructura de herramienta no integrada que expuse en la de construir índices buscador. La principal ventaja de este reemplazador de texto es que podemos usar expresiones regulares para hacer cambios genéricos en una lista de documentos html, js, css y en definitiva en cualquier documento de texto. Me será de gran ayuda en la migración que estoy ahora haciendo desde documentos escritos con sintaxis xhtml para convertirlos en documentos html-5. Puede descargar estos archivos conteniendo lo necesario para instalarla en su localhost y probarla:

  • index.php(.txt): interfaz de la página PHP con el formulario para manejar esta herramienta para reemplazar texto (quitar la extensión txt tras copiarlo en su ubicación).
  • replace.php(.txt): módulo PHP con las funciones que ejecutan la herramienta (quitar la extensión txt tras copiarlo en su ubicación).
  • lista-datos.txt: un archivo de texto con la lista de configuraciones.
  • datos-general.txt: un archivo de texto con la configuración general.
  • informe-general.txt: un archivo de texto con el informe de resultados de la configuración general.

Todos estos archivos deben estar ubicados en la misma carpeta, alguna de su servidor Apache montado como localhost. Se trata de una aplicación que tiene utilidad para realizar tareas de mantenimiento del borrador del sitio. Pero no está preparada para usar en línea con el sitio en producción pues, por ejemplo, no se observan cuestiones de seguridad.

Funcionamiento de la herramienta para reemplazar texto

El primer paso para ejecutar la herramienta es construir la lista de rutas. Esto ya lo expliqué en construir índices, aunque en esta captura de pantalla presento sólo una ruta a un único documento de ejemplo, pues podemos construir esa lista con el botón o bien escribir directamente una o varias rutas (separadas por salto de línea) en el área de texto:

lista rutas

Ese documento de prueba era un simple HTML que contenía unos elementos <b>...</b> y quería cambiar todos los <b> por elementos <strong>. Para ello usamos el siguiente paso en la pestaña ejecución:

lista rutas

En primer lugar vemos un desplegable con la configuración denominada general. Los botones nueva y eliminar nos permiten crear y borrar configuraciones. Se trata de guardar la configuración del texto que está debajo, lo que se hace en el archivo datos-general.txt que almacenará ese texto. Los comentarios son líneas que empiezan con el caracter # y pueden ponerse en cualquier sitio, pues serán ignorados. El resto de líneas son los datos de este archivo, es decir, los patrones y reemplazos. El que vemos en la imagen es este texto:

/\<(\/?)b\>/
<$1strong>

Aunque en esta captura de pantalla sólo hay un patrón, puede incluir cuantos quiera separándolos con una línea con ::--, pero poniendo este separador sólo entre los grupos, no al inicio ni al final:

/\<(\/?)b\>/
<$1strong>
::--
/buscar[ \s]+esto/mi
y reemplazar por esto incluyendo
un salto de línea
::--
/\<(\/?)i\>/
<$1em>

En cada grupo la primera línea contiene el patrón mediante una expresión regular, todo en una única línea. Ese patrón será buscado en los archivos de la lista de rutas y reemplazado por la línea (o líneas) que vienen a continuación. Tenga en cuenta que la parte de reemplazo es todo lo que viene tras la primera línea del patrón, por lo que incluirá los saltos de línea. Hay que observar los saltos que puedan existir al final del archivo pues formarán parte del reemplazo del último patrón. En el ejemplo de la captura de pantalla la expresión regular buscar cualquier tag o etiqueta <b> o </b> y la reemplaza por <strong> o </strong> respectivamente. El botón de reemplazar ejecuta esa acción, aunque es necesario guardar el contenido previamente. Tras la ejecución en todos los archivos de la lista de rutas obtenemos un informe de resultados como este:

lista rutas

Por cada archivo de la lista de rutas nos dice si el patrón fue reemplazado o no encontrado en su caso. Si hay un error en la expresión regular se cancelará el proceso no haciendo modificaciones en el archivo. Cuando realice cambios en una lista de rutas con muchos documentos, debe realizar una copia de seguridad previa, pues esta herramienta (no integrada) no contempla la facilidad de poder revertir los cambios. Tenga en cuenta que la correcta ejecución depende de un adecuado patrón, por lo que es indispensable hacer pruebas previas con las expresiones regulares en todos los supuestos antes de hacer cambios genéricos en una lista grande de documentos.

Declaraciones del módulo replace.php

El archivo index.php tiene una estructura similar a la que ya expuse en construir indices. El módulo replace.php contiene las siguientes declaraciones. Estas son constantes para definir la carpeta raíz, el salto de línea y un separador de patrones:

define("RAIZ", $_SERVER["DOCUMENT_ROOT"]);
define("SALTO", "\r\n");
define("SEPARA", "\n::--\n");

En el informe de resultado ponemos la fecha y hora, por lo que se hace necesario definir la zona horaria. Puede consultarlo en PHP timezones. La función auxiliar fecha_actual() nos devuelve la fecha-hora con un formato personalizado:

date_default_timezone_set("Europe/London");
function fecha_actual()

La función para listar rutas es esta:

function listar_rutas($desde, $extensiones, $carpetas)

Estas dos funciones nos permiten leer y escribir un archivo de texto:

function extraer_contenido($archivo)
function guardar_contenido($archivo, $contenido, $modo="w")

Las siguientes son las que ejecutan la búsqueda y reemplazo. La primera cargar_patrones($datos) lee el contenido de texto del área de datos de patrones quitando los comentarios y separando los patrones de sus reemplazos, devolviéndolos en dos arrays. La ejecución se encomienda a reemplazar_lista() tomando la lista de rutas, los patrones y reemplazos y devolviendo el informe de resultados que se encuentra en la $ruta_informe. Por cada ruta de la lista de rutas se llama a reemplazar_archivo():

function cargar_patrones($datos)
function reemplazar_lista($lista_rutas, $datos, $ruta_informe)
function reemplazar_archivo($archivo, $cadnum, $arr_pat, $arr_sus)

Por último hay un grupo de funciones para manejar la edición de configuraciones. La función cargar_lista_datos() abre el archivo lista-datos.txt donde se encuentran las claves de las configuraciones. Con esta función podemos por ejemplo, cargar el desplegable que aparece en el formulario. Con las otras dos funciones podemos crear una nueva clave para una configuración o eliminar alguna. La clave general no puede ser eliminada, pues sirve de plantilla para crear nuevas.

function cargar_lista_datos($clave_datos)
function crear_clave($clave_datos_nueva, $lista_datos)
function eliminar_clave($clave_datos, $lista_datos)