DanLevy.net

De zéro à expert Regex

Extraire et analyser des chaînes de type URL avec une seule expression régulière

Table des matières

TL;DR : Passez directement à la regex de plus de 120 octets.

🚀 Introduction

L’extraction d’URLs depuis du texte brut peut parfois ressembler à une partie de whack-a-mole. La ponctuation, les parenthèses englobantes et les formats ambigus s’associent pour saboter vos efforts. Que vous développiez un web scraper, un analyseur de données ou une application de chat, l’extraction fiable des URLs est indispensable.

Dans cet article, nous abordons le problème de front avec une approche flexible en deux étapes. Notre objectif est de capturer toutes les chaînes potentielles de type URL en premier, puis de traiter la validation dans une étape ultérieure.

💡 Note : Ce pattern ne sert pas à valider des URLs ! Il est délibérément permissif concernant la ponctuation et les erreurs de saisie.

🔍 Objectif : Extraire des URLs depuis du texte

Lors de l’extraction d’URLs depuis du texte brut, une approche en deux étapes fait ses preuves :

  1. Capturer tout ce qui ressemble à une URL : Lancer un large filet pour saisir toutes les chaînes qui pourraient être des URLs. C’est là que notre “regex de plus de 120 octets” montre toute son utilité.
  2. Valider : Une fois ces candidats capturés, utilisez des vérifications secondaires (par ex. résolution DNS, comparaison avec des domaines connus) pour écarter les entrées invalides.

Visualiser le défi

Les termes extract et parse sont souvent employés de manière interchangeable, mais ils désignent des processus distincts. L’extraction d’URL consiste à identifier et à capturer des chaînes susceptibles d’être des URL au sein d’un texte plus large. Le parsing, en revanche, consiste à décomposer ces URL en leurs composants élémentaires.

Lorsque j’évoque le parsing ou les « parties d’une URL », je fais référence aux composants suivants :

Les 5 parties de toute URL
Anatomie d'une URL, visualisée

Cliquez pour afficher une capture d’écran de la correspondance de sous-chaîne sur RegEx101.

Avant d’entrer trop profondément dans la regex, utilisons un outil visuel pour évaluer la capacité de mon pattern à capturer un grand nombre de correspondances :

Utilisation de RegEx101.com pour visualiser les correspondances multi-lignes
Aperçu des correspondances multi-lignes groupées

La regex de plus de 120 octets

Voici une regex concise conçue pour extraire et analyser les URL en une seule passe. Elle prend en charge divers protocoles, domaines, chemins, ainsi que les sections optionnelles de requête et de fragment.

Ne vous inquiétez pas — nous allons l’analyser étape par étape !

Regex URL de plus de 120 octets
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'"`\.,!]*)
Partagez les regex les plus délirantes que vous ayez rencontrées (ou rédigées) dans les commentaires ci-dessous ! 🚀

🧩 Décomposition étape par étape

Décortiquons la regex en ses composants pour comprendre son fonctionnement :

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

2. Domaine (Groupe 2) : ([^-/.[](|)s?][^`/s]?]+)

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

4. Chaîne de requête (Groupe 4) : [?]?([^#\s`?]*)

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

🛠️ Exemple d’analyse

Voici comment exploiter cette regex monstrueuse avec un peu de JavaScript :

☑️ Étapes suivantes

Selon votre cas d’usage, vous devrez peut-être affiner cette regex ou ajouter des étapes de validation et de post-traitement.

Projets variés, besoins distincts

Les projets présentent des exigences et des enjeux de sécurité variés :

  1. Web Scraping : Valider les URL pour garantir leur accessibilité et leur fiabilité.
  2. Traitement des données : Extraire les URL de contenus générés par les utilisateurs tout en maintenant des contrôles de sécurité.
  3. Analyse de données : Filtrer les doublons ou les liens non pertinents à des fins de recherche ou de marketing.
  4. Applications côté utilisateur : Transformer automatiquement les URL en liens hypertextes dans les applications de chat ou les forums.

Post-traitement et validation

Une fois les URL candidates récupérées, appliquez des vérifications supplémentaires :

📝 Résumé

L’extraction de données textuelles semi-structurées est probablement la partie la plus gratifiante de la maîtrise des regex.

Voici un résumé des points clés à retenir :

En suivant cette approche, vous pouvez extraire efficacement toute donnée textuelle semi-structurée, posant ainsi les bases d’un traitement et d’une validation ultérieurs.

📚 Pour aller plus loin