DanLevy.net

Da zero a Esperto Regex

Estrai e analizza stringhe simili a URL con un'unica regex

Indice

TL;DR: Vai direttamente alla regex da 120+ byte.

🚀 Introduzione

Estrarre gli URL da testo grezzo può talvolta sembrare un noioso gioco del molla la talpa. Punteggiatura, parentesi di delimitazione e formattazione ambigua conspirano per vanificare i tuoi tentativi. Che tu stia sviluppando un web scraper, un analizzatore di dati o un’app chat, garantire un’estrazione precisa degli URL è un requisito fondamentale.

In questo post affrontiamo il problema direttamente, adottando un approccio flessibile in due fasi. L’obiettivo è catturare prima tutte le stringhe potenzialmente simili a URL e delegare la validazione a una fase successiva.

💡 Nota: Questo pattern non serve per validare gli URL! È volutamente permissivo con punteggiatura e errori di battitura.

🔍 Obiettivo: Estrarre gli URL dal testo

Quando si estraggono URL da testo grezzo, un approccio in due fasi si dimostra efficace:

  1. Catturare tutto ciò che assomiglia a un URL: Lanciare una rete ampia per intercettare tutte le stringhe che potrebbero essere URL. È qui che la nostra “regex da oltre 120 byte” mostra il suo valore.
  2. Validare: Una volta isolati questi candidati, applicare controlli secondari (es. risoluzione DNS, confronto con domini noti) per scartare le voci non valide.

Visualizzare la sfida

I termini extract e parse sono spesso usati in modo intercambiabile, ma indicano processi distinti. L’estrazione di URL consiste nell’identificare e catturare potenziali URL da un testo più ampio. Il parsing, invece, scompone questi URL nelle loro componenti.

Quando parlo di parsing o “componenti di un URL”, mi riferisco a:

I 5 componenti di tutti gli URL
Anatomia di un URL, visualizzata

Fai clic per vedere uno screenshot del matching delle sottostringhe su RegEx101.

Prima di approfondire la regex, usiamo uno strumento visuale per verificare quanto bene il pattern catturi le corrispondenze:

Utilizzo di RegEx101.com per visualizzare le corrispondenze multilinea
Anteprima delle corrispondenze multilinea 'bulk'

La regex da oltre 120 byte

Di seguito una regex concisa per estrarre e analizzare gli URL in un’unica operazione. Supporta vari protocolli, domini, percorsi e sezioni query/fragment opzionali.

Non preoccupatevi, lo analizzeremo passo dopo passo!

120+ Byte URL Regex
const urlRegex = /([-.a-z0-9]+:\/{1,3})([^-\/\.[\](|)\s?][^`\/\s\]?]+)([-_a-z0-9!@$%^&*()=+;/~\.]*)[?]?([^#\s`?]*)[#]?([^#\s'"`\.,!]*)/gi;
// Compatibility: ES5+
// Same pattern, split on newlines for readability:
([-.a-z0-9]+:\/{1,3})
([^-\/\.[\](|)\s?][^`\/\s\]?]+)
([-_a-z0-9!@$%^&*()=+;/~\.]*)
[?]?([^#\s`?]*)
[#]?([^#\s'"`\.,!]*)
Condividete le regex più bizzarre che avete incontrato (o scritto) nei commenti qui sotto! 🚀

🧩 Scomposizione passo dopo passo

Analizziamo la regex nei suoi componenti per comprenderne il funzionamento:

1. Protocollo (Gruppo 1): ([-.a-z0-9]+:/{1,3})

2. Dominio (Gruppo 2): ([^-/.[](|)s?][^`/s]?]+)

3. Percorso (Gruppo 3): ([-_a-z0-9!@$%^&*()=+;/~\.]*)

4. Query (Gruppo 4): [?]?([^#\s`?]*)

5. Fragment (Gruppo 5): [#]?([^#\s’”`.,!]*)

🛠️ Esempio di Parsing

Ecco come puoi sfruttare questa regex mostruosa, con un po’ di JavaScript:

☑️ Passi successivi

A seconda del caso d’uso, potresti dover affinare questa regex o integrare ulteriori passaggi di validazione e post-elaborazione.

Progetti diversi, esigenze diverse

I progetti presentano requisiti e preoccupazioni per la sicurezza variabili:

  1. Web Scraping: Validare gli URL per garantirne la raggiungibilità e l’affidabilità.
  2. Elaborazione Dati: Estrarre gli URL dai contenuti generati dagli utenti applicando filtri di sicurezza.
  3. Analisi Dati: Scartare duplicati o link irrilevanti per finalità di ricerca o marketing.
  4. Applicazioni per l’Utente: Generare automaticamente link ipertestuali per gli URL in app di chat o forum.

Post-elaborazione e Validazione

Una volta raccolte le corrispondenze potenziali, applicare controlli supplementari:

Estrarre dati testuali semi-strutturati è probabilmente la parte più soddisfacente del dominio delle regex.

Ecco un riepilogo dei punti chiave:

Seguendo questa procedura, puoi estrarre efficacemente qualsiasi dato testuale semi-strutturato, gettando le basi per elaborazioni e validazioni successive.

📚 Approfondimenti