Ir al contenido
Allin

Extraer todas las direcciones de correo o URL de un bloque de texto

Publicado el 10/8/2026 · 14 min de lectura · Herramientas de texto e idioma

Daniel Okonkwo

Daniel OkonkwoDesarrollador front-end y redactor de Tecnología en Allin

Rendimiento web · Formatos de archivo

Verificado con 4 fuentes

Ver perfil
En resumen

extract-urls busca tramos de texto que empiezan por http:// o https:// y siguen hasta un espacio, una comilla doble, un apóstrofo, un signo de mayor o menor, o un paréntesis de cierre. Esa definición explica casi todo lo que acierta y todo lo que falla. Acierta los enlaces entre paréntesis y los enlaces Markdown. Conserva el punto de una URL que cierra una frase, conserva una coma, un punto y coma, una exclamación o un corchete de cierre, y trunca el artículo de Wikipedia Fox_(animal) en Fox_(animal: un enlace roto en vez de ausente, lo cual es peor. Además no tiene indicador de insensibilidad a mayúsculas, así que un enlace escrito HTTPS://EXAMPLE.COM en un documento en mayúsculas no se encuentra en absoluto. Las direcciones www desnudas sin esquema tampoco se encuentran, ni los enlaces ftp o mailto. extract-emails se comporta al revés al final de una frase: como su patrón debe terminar en letras, un punto final se deja fuera correctamente. Pero su clase de caracteres para la parte local es solo ASCII, así que una dirección que empieza por letra acentuada vuelve truncada en lugar de omitida: un nombre francés muy conocido con acento circunflejo produjo una dirección tres letras más corta, y un apellido con apóstrofo perdió todo lo anterior al apóstrofo. Son direcciones equivocadas, no omisiones, y no hay aviso alguno. También lee las credenciales de una URL con la forma usuario:contraseña@servidor como si fueran un correo. Comprueba lo que sale antes de enviar nada a esas direcciones.

Una URL al final de una frase se queda con el punto; una dirección de correo al final de esa misma frase, no. Un nombre acentuado dentro de una dirección vuelve truncado. Cada caso se pasó por las herramientas y aquí está la salida exacta.

De quién son estos datos

Este artículo está escrito para quien procesa texto que ya posee: una exportación de contactos de un sistema que administras, una lista de enlaces salida de tu propio documento, un conjunto de direcciones que un cliente te envió para que las ordenaras. Recoger direcciones de páginas web ajenas para construir una lista de correo es otra actividad, con su propio riesgo legal: bajo el Reglamento General de Protección de Datos, una dirección de correo que identifica a una persona es dato personal sea cual sea la página donde se publicó, y las normas antispam que rigen el correo comercial no solicitado se suman a ello. Eso es todo lo que se dirá aquí al respecto.

La razón práctica para decirlo es que ambas herramientas se ejecutan enteramente en la página, en tu máquina, sin subir nada. Eso es una propiedad real de privacidad cuando el texto es una lista de clientes, y conviene saberlo. No es un permiso legal, y las dos cosas se confunden con suficiente frecuencia como para merecer separarse en una frase antes de pasar a lo que las herramientas hacen de verdad.

Dónde termina una URL es una conjetura, y esta se juega en cinco caracteres

El estándar URL del WHATWG define qué es una URL y cómo analizar una que ya has aislado. No define cómo encontrar una dentro de un párrafo de prosa, porque esa pregunta no tiene respuesta correcta: un punto tras una URL es puntuación para quien lee y un carácter de ruta legítimo para un analizador, y nada en los bytes los distingue. Cada extractor elige, pues, un conjunto de caracteres donde detenerse. Este se detiene en los espacios, la comilla doble, el apóstrofo, ambos signos angulares y el paréntesis de cierre, y se contrastó con quince contextos para ver adónde lleva eso.

Excluir el paréntesis de cierre compra dos casos importantes. Un enlace entre paréntesis sale limpio, y también un enlace Markdown escrito como texto entre corchetes seguido de la dirección entre paréntesis. Cuesta un caso, y el coste es peor de lo que la ventaja es buena: una dirección que contiene legítimamente paréntesis en su ruta —la convención de desambiguación de Wikipedia es el ejemplo cotidiano— se corta en la pareja del paréntesis de apertura y se devuelve truncada. Una URL truncada sigue pareciendo una URL. Va a una hoja de cálculo, se pincha, y produce un página no encontrada semanas después sin nada que permita rastrearlo.

Los caracteres que no excluye son los que puntúan la escritura corriente. Una URL al final de una frase volvió con el punto pegado. Lo mismo con una seguida de coma, una seguida de punto y coma, una seguida de exclamación, una entre corchetes, una entre comillas tipográficas curvas, una envuelta en guiones bajos de Markdown y otra entre acentos graves. Las comillas angulares francesas sobreviven, pero solo porque por convención se escriben con un espacio a cada lado, y es el espacio lo que detiene la coincidencia. Ninguno de estos casos produce un error; producen una cadena ligeramente equivocada que hay que limpiar a mano.

El enlace en mayúsculas que nunca se encuentra

El patrón está escrito en minúsculas y no lleva indicador de insensibilidad a mayúsculas. Un texto con HTTPS://EXAMPLE.COM/A no devolvió nada en absoluto. Tampoco Https://example.com/a con una sola mayúscula, que es lo que producen algunos procesadores de texto cuando un enlace abre una frase y la mayúscula automática está activa. No es un caso límite; es toda una categoría de documento —notas de prensa, avisos legales, cualquier cosa compuesta en un estilo de casa que grita— de la que esta herramienta extraerá cero enlaces sin informar de problema alguno. El estándar URL dice explícitamente que el esquema se compara tras pasarlo a minúsculas: un esquema en mayúsculas es una URL normal y válida, no una malformada.

Otras tres ausencias son de diseño y no accidentales, y ayuda saber cuál es cuál. Una dirección desnuda del tipo www seguido de un dominio no tiene esquema, así que no coincide, y no podría hacerlo sin que la herramienta adivine que toda palabra con puntos es un servidor. Un enlace ftp no coincide. Un enlace mailto no coincide, aunque extract-emails sí sacará de él la dirección con gusto. Si tu fuente es una página de datos de contacto escrita por una persona y no por una máquina, cuenta con que las direcciones desnudas sean mayoría y prevé una segunda pasada con extract-domain, que sí las busca.

La dirección acentuada que vuelve equivocada

extract-emails busca una secuencia de letras, cifras, puntos, guiones bajos, signos de porcentaje, signos más y guiones, luego una arroba, luego un servidor, luego un punto y al menos dos letras. Una etiqueta tras un más sobrevive, lo cual importa porque así es como mucha gente etiqueta sus suscripciones. Un punto final se deja fuera correctamente, porque el patrón tiene que terminar en letras: la misma frase que pega un punto no deseado a una URL da a una dirección un final limpio, bonita ilustración de cuánto decide la forma del patrón.

La parte local es solo ASCII, y ahí pasa de incompleta a equivocada. Como una expresión regular busca una coincidencia en cualquier punto de la línea en vez de exigir el token entero, una dirección cuya primera letra lleva acento no deja de coincidir: coincide a partir de justo después de la letra acentuada. Un nombre alemán con diéresis produjo una dirección formada por las dos últimas letras del nombre más la arroba y el servidor. Un nombre francés con cedilla perdió sus tres primeras letras. Un nombre portugués con tilde solo conservó la última. Y un apellido con apóstrofo devolvió solo la parte posterior al apóstrofo. Cada una de ellas es una dirección sintácticamente válida que pertenece a otra persona, o a nadie, y nada en la salida lo marca.

La mitad del dominio tiene el problema simétrico y falla de forma más segura. Un servidor escrito con letras acentuadas en su propio alfabeto —los nombres de dominio internacionalizados que define el RFC 5890 y que el RFC 6532 permite en las cabeceras de correo— no coincide en absoluto, así que la dirección se omite en vez de destrozarse. Escrito en su forma punycode, empezando por el prefijo x-n, ese mismo servidor coincide sin problema, porque el punycode es ASCII por construcción. Dos notas menores de las pruebas: una parte local entrecomillada, que el RFC 5322 permite, no se reconoce; y una dirección en caja mixta y su gemela en minúsculas sobreviven ambas a la eliminación de duplicados, porque la comparación es exacta mientras que la mitad del dominio es insensible a mayúsculas por especificación, de modo que esas dos son un solo buzón listado dos veces.

Dominios y números de teléfono, en breve

extract-domain cubre el hueco que deja el extractor de URL: lee servidores de enlaces con esquema, de direcciones de correo y —con un interruptor activo por defecto— de dominios desnudos escritos sin esquema alguno. Quita el usuario y la contraseña situados delante de un servidor, el puerto de detrás, el punto raíz final y, opcionalmente, un www inicial. Todo eso se confirmó sobre una línea con una dirección de intranet con credenciales. También rechaza una lista de extensiones de archivo para que una imagen o un archivo de página no se lea como dominio, y las que están en la lista sí se omiten.

Dos defectos que merece la pena señalar. Primero, un dominio desnudo al final de una frase se pierde por completo: el patrón que encuentra dominios desnudos se niega a detenerse delante de un punto, así que una frase acabada en un dominio seguido de punto no devolvió nada, mientras que ese mismo dominio en mitad de una frase, o ante una coma, o ante una exclamación, sí se encontró. Y esa es la forma más corriente en que un dominio aparece en un texto, y es el único caso que no maneja. Segundo, la lista de extensiones es una lista fija y no una regla, así que las extensiones que no están en ella se leen como dominios: un archivo comprimido y un archivo de vídeo volvieron como si fueran servidores. Ninguno de los dos problemas produce mensaje de error.

extract-phone-numbers es el más prudente de los cuatro. Reconoce cuatro formas concretas en vez de cualquier secuencia de cifras, exige entre siete y quince dígitos una vez quitada la puntuación, y se comprobó que deja en paz las fechas tanto en año-mes-día como en día/mes, y que deja en paz un número de referencia largo. Lo que no puede hacer es distinguir un teléfono de algo cuya forma es exactamente la de un teléfono: una referencia de pedido de tres cifras, tres cifras y cuatro cifras volvió como número norteamericano, y nada en el texto dice lo contrario. Lee su salida en vez de fiarte de ella, frase a la que este artículo vuelve una y otra vez.

Casos difíciles pasados por los extractores, con la salida exacta observada
EntradaLo que salePor qué
Un enlace al final de una frase, en extract-urlsEl enlace con el punto pegadoEl conjunto de parada es espacio, comilla, apóstrofo, angulares y paréntesis de cierre — no el punto
Un enlace entre paréntesis, o un enlace MarkdownLimpio, sin el paréntesisEl paréntesis de cierre está en el conjunto de parada
Un artículo de Wikipedia cuya ruta acaba entre paréntesisTruncado en el paréntesis de cierre — un enlace roto, no ausenteLa misma regla que salva los enlaces entre paréntesis rompe este
Un enlace escrito con esquema en mayúsculasNada en absolutoEl patrón está en minúsculas y no lleva indicador de insensibilidad a mayúsculas
Una dirección con etiqueta tras un más, antes de la arrobaExtraída entera, con la etiquetaEl signo más está dentro de la clase de caracteres de la parte local
Una dirección cuyo nombre lleva diéresis, cedilla o tildeUna dirección más corta, sintácticamente válida y equivocada — sin avisoLa clase de la parte local es ASCII, y la coincidencia arranca justo después de la letra acentuada
Una dirección en un servidor escrito en alfabeto acentuadoNada — pero la escritura punycode de ese mismo servidor sí funcionaOmitir es más seguro que destrozar; el punycode es ASCII por construcción
Una URL con usuario y contraseña delante del servidorextract-emails informa de la contraseña y el servidor como si fueran un correoUna arroba entre dos secuencias plausibles es todo lo que el patrón necesita
Un dominio desnudo al final de una frase, en extract-domainNada — aunque ese mismo dominio ante una coma sí se encuentraEl patrón de dominios desnudos se niega a parar ante un punto, y el punto final es un punto
Extraer URLsExtrae cada enlace único de un bloque de texto. Suelta un archivo en vez de pegarlo: se lee en tu navegador y nunca se envía.Probar la herramienta

Preguntas frecuentes

¿Por qué mis enlaces extraídos salen con un punto o una coma al final?
Porque el extractor se detiene en los espacios, las comillas, los angulares y el paréntesis de cierre, y en nada más. La puntuación de la frase es un carácter de ruta legítimo para el patrón, así que el punto que cierra tu frase pasa a ser el último carácter del enlace. No hay ajuste que lo cambie. El arreglo práctico es una pasada de buscar y reemplazar sobre la lista extraída, o un recorte manual si la lista es corta. El problema no afecta a las direcciones de correo extraídas, porque su patrón debe terminar en letras: un punto final no puede formar parte de una coincidencia.
Algunos enlaces de mi documento no se encontraron. ¿Qué tenían en común?
Mira primero el esquema. Un enlace cuyo esquema lleve cualquier mayúscula es invisible para esta herramienta: una dirección toda en mayúsculas no devolvió nada al probarla, y tampoco una con una sola mayúscula inicial, que es lo que produce un procesador de textos cuando un enlace abre una frase. Después busca enlaces sin esquema: una dirección desnuda que empieza por www no se reconoce, porque el patrón exige el protocolo. Y los enlaces ftp y mailto quedan fuera de su ámbito por diseño. Pasar el documento a minúsculas antes de extraer arregla lo primero; extract-domain, que sí busca servidores desnudos, cubre casi todo lo segundo.
¿Las direcciones que devuelve son seguras tal cual?
No sin mirarlas. El extractor garantiza que cada resultado coincide con su patrón, no que cada resultado sea una dirección que alguien posee. Se observaron directamente dos modos de fallo: una dirección cuya parte local empieza por letra acentuada se devuelve truncada, lo que produce una dirección de aspecto válido que no es la del texto; y las credenciales de una URL con la forma usuario, dos puntos, contraseña, arroba, servidor se devuelven como si fueran una dirección. Si la lista es corta, léela. Si es larga, ordénala y mira los extremos: las direcciones truncadas se agrupan arriba porque son cortas, y las fabricadas suelen compartir un servidor que reconocerás como tal y no como proveedor de correo.
¿Decodifica la entidad del ampersand en una cadena de consulta?
No. Una URL copiada del código HTML, donde el separador entre dos parámetros se escribe como entidad del ampersand y no como el carácter, vuelve con la entidad intacta: se probó y los cinco caracteres se conservan exactamente. El resultado es un enlace que se pedirá con nombres de parámetro que empiezan por «amp punto y coma», lo que normalmente significa que el servidor ignora en silencio el segundo parámetro. Si tu fuente es HTML y no texto renderizado, decodifica antes las entidades; si es texto copiado de una página renderizada, el navegador ya las ha decodificado y no hay nada que hacer.
¿Puedo usar estas herramientas con direcciones recogidas de sitios web ajenos?
Las herramientas procesarán lo que pegues; si puedes recoger y usar esas direcciones es otra cuestión, y no técnica. En la Unión Europea, una dirección de correo que identifica a una persona es dato personal según el Reglamento General de Protección de Datos, sea cual sea la página en que apareciera, y las normas sobre correo comercial no solicitado se aplican por separado. En Estados Unidos las normas equivalentes sobre correo comercial son federales. Si la lista es tuya —tu propia exportación, tu propio documento, datos de un cliente que te encargó limpiarlos—, nada de esto se plantea, y esa es la situación para la que se escribió este artículo. Si no lo es, la pregunta que hay que responder es jurídica, y no la responde el hecho de que la página fuera pública.

Artículos que podrían interesarte

Todas las guías
TutorialBases de regex: guía para principiantesUna expresión regular es un patrón para buscar texto. Aquí tienes los bloques — clases de caracteres, cuantificadores y anclas — con un ejemplo.GuíaConstruir una URL con parámetros que sobreviva a un copiar y pegarTres codificaciones, una diferencia visible: %20 o +. El modo formulario del generador reproduce URLSearchParams byte a byte en diecisiete valores, pero dale una URL base con un fragmento y todos los parámetros acaban dentro del hash, donde ningún servidor los ve.GuíaQuitar HTML con criterio: lo que un eliminador de etiquetas puede y no puede hacerQuitar etiquetas y sanear HTML son dos trabajos distintos. Un fragmento real pasado por una regex ingenua y por un limpiador consciente del formato, con el contenido de script y style, los cortes de bloque, los comentarios, los CDATA y el orden de las entidades mostrados en la salida.ComparativacamelCase, snake_case, kebab-case: cuál usar, y por qué rara vez eliges túLas convenciones no son cuestión de gusto. El guion es el operador menos, así que kebab-case no puede ser un identificador en la mayoría de lenguajes, y por eso justamente lo usan CSS y las URL. Además, el viaje de ida y vuelta con siglas que corrompe nombres en silencio, y la regla que lo arregla.ExplicaciónPunto y coma, tabulación, barra: elegir un delimitador que sobreviva al viajePor qué el idioma de quien lee decide el delimitador, qué hace el conversor con el entrecomillado al cambiar, qué es realmente la primera línea sep=, y el recuento de celdas entrecomilladas en la misma exportación escrita de cinco maneras.GuíaCódigos de estado HTTP explicados: los que de verdad se confunden301 frente a 308, 302 frente a 307, 401 frente a 403, 404 frente a 410 — y qué promete de verdad Retry-After en un 429 o un 503. Los pares donde elegir mal el código cambia el comportamiento, no solo la redacción.

Herramientas relacionadas

Todo lo que sigue describe lo que hacen estas herramientas hoy, comprobado ejecutando sus propias transformaciones sobre las entradas exactas que aparecen en cada artículo, y no lo que una norma obligue a hacer a una herramienta de texto. El tratamiento del texto línea a línea no tiene una autoridad única: qué cuenta como espacio, si dos líneas acentuadas son o no la misma línea, y dónde termina una URL dentro de una frase se deciden de forma distinta en cada programa en el que pegues texto. Cuando una herramienta falla en un caso, se dice claramente en vez de esquivarlo. Antes de pasar nada de esto por una lista que no puedas volver a exportar, pásalo por una copia y compara el número de líneas en ambos extremos.

Fuentes

¿Has detectado un error en este artículo?