La réponse directe : Pour supprimer les balises HTML avec des expressions régulières, utilisez le motif <[^>]+> pour des cas simples, ou <(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+> pour gérer les attributs avec guillemets. Cependant, cette approche a des limites importantes et ne convient qu’au nettoyage de contenu HTML simple.
⚠️ Avertissement important
Les expressions régulières ne peuvent pas analyser de manière fiable tout le HTML. Pour du HTML complexe, utilisez un parseur HTML dédié comme DOMParser en JavaScript ou BeautifulSoup en Python.
🎯 Quand utiliser les regex pour nettoyer le HTML
Les expressions régulières sont adaptées dans ces situations spécifiques :
- Contenu HTML simple et bien formé sans balises imbriquées complexes
- Validation d’entrées utilisateur pour détecter les tentatives d’injection
- Nettoyage rapide de données dans des scripts de traitement par lots
- Environnements contraints où l’utilisation de bibliothèques externes n’est pas possible
📋 Les motifs regex essentiels
| Motif | Usage | Avantages/Inconvénients |
|---|---|---|
<[^>]+> |
HTML basique | ✅ Simple ❌ Échoue avec > dans les attributs |
</?w[^<>]*?> |
Balises avec fermeture | ✅ Plus robuste ❌ Toujours limité |
<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+> |
Attributs avec guillemets | ✅ Gère les attributs ❌ Plus complexe |
💻 Le motif de base expliqué
Le pattern <[^>]+> fonctionne ainsi :
<: correspond au caractère d’ouverture de balise[^>]+: correspond à un ou plusieurs caractères qui ne sont pas>>: correspond au caractère de fermeture de balise
🔧 Exemple JavaScript basique
const html = '<p>Bonjour <b>monde</b>!</p>';
const cleanText = html.replace(/<[^>]+>/g, '');
console.log(cleanText); // "Bonjour monde!"
🚀 Implémentation pratique par langage
JavaScript : méthode complète
function stripHtmlTags(html) {
try {
// Motif robuste pour gérer les attributs avec guillemets
const htmlRegex = /<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g;
// Suppression des balises
let cleanText = html.replace(htmlRegex, '');
// Nettoyage des espaces multiples et des sauts de ligne
cleanText = cleanText.replace(/s+/g, ' ').trim();
return cleanText;
} catch (error) {
console.error('Erreur lors du nettoyage HTML:', error);
return html;
}
}
// Test avec différents cas
const exemples = [
'<p>Texte simple</p>',
'<img title="image avec >" src="test.jpg">Texte',
'<div class="container">Contenu <span>imbriqué</span></div>'
];
exemples.forEach(html => {
console.log(`Original: ${html}`);
console.log(`Nettoyé: ${stripHtmlTags(html)}n`);
});
PowerShell : syntaxe optimisée
# Fonction PowerShell pour nettoyer le HTML
function Remove-HtmlTags {
param(
[Parameter(Mandatory=$true)]
[string]$HtmlContent
)
# Suppression des balises avec l'opérateur -replace
$cleanContent = $HtmlContent -replace '<[^>]+>', ''
# Nettoyage des espaces
$cleanContent = ($cleanContent -replace 's+', ' ').Trim()
return $cleanContent
}
# Exemple d'utilisation
$html = '<html><body><p>Valeur importante</p></body></html>'
$result = Remove-HtmlTags -HtmlContent $html
Write-Output $result
SQL/Tableau : traitement en base
-- Exemple SQL avec REGEXP_REPLACE
SELECT
original_html,
REGEXP_REPLACE(original_html, '<[^>]+>', '') AS clean_text,
TRIM(REGEXP_REPLACE(original_html, '<[^>]+>', '')) AS trimmed_clean_text
FROM content_table;
-- Fonction Tableau
REGEXP_REPLACE([HTML_Field], '<[^>]+>', '')
⚠️ Pièges courants et solutions
Problème : caractère > dans les attributs
Ce code HTML pose problème avec le motif simple :
<img title="Affiche >" src="image.png">Texte
Le motif <[^>]+> s’arrêtera au premier > dans l’attribut, cassant l’analyse.
Solution : Utilisez le motif avancé qui gère les guillemets :
const advancedRegex = /<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g;
const problematicHtml = '<img title="Affiche >" src="test.png">Texte';
const cleaned = problematicHtml.replace(advancedRegex, '');
console.log(cleaned); // "Texte"
Gestion des espaces résiduels
Après suppression des balises, il reste souvent des espaces multiples :
function cleanHtmlWithSpaces(html) {
return html
.replace(/<[^>]+>/g, '') // Suppression des balises
.replace(/s+/g, ' ') // Espaces multiples → espace simple
.replace(/ns*/g, ' ') // Sauts de ligne → espace
.trim(); // Suppression espaces début/fin
}
🎯 Cas d’usage avancés
Extraction de contenu spécifique
Pour récupérer uniquement le contenu entre certaines balises :
// Extraire le contenu des paragraphes
const extractParagraphs = (html) => {
const paragraphRegex = /<p[^>]*>(.*?)</p>/gi;
const matches = [];
let match;
while ((match = paragraphRegex.exec(html)) !== null) {
matches.push(match[1].replace(/<[^>]+>/g, ''));
}
return matches;
};
// Exemple
const html = '<p>Premier paragraphe</p><div>Div ignorée</div><p>Second <b>paragraphe</b></p>';
console.log(extractParagraphs(html)); // ["Premier paragraphe", "Second paragraphe"]
Validation d’entrées utilisateur
// Fonction de validation pour détecter les balises HTML
function containsHtmlTags(input) {
const htmlTagRegex = /<[^>]+>/;
return htmlTagRegex.test(input);
}
// Utilisation dans un formulaire
function validateUserInput(userInput) {
if (containsHtmlTags(userInput)) {
throw new Error('Les balises HTML ne sont pas autorisées dans ce champ');
}
return userInput;
}
🔄 Alternatives recommandées
Parseurs HTML natifs
Pour une solution robuste, privilégiez les parseurs HTML :
JavaScript avec DOMParser
function stripHtmlWithDOM(html) {
const doc = new DOMParser().parseFromString(html, 'text/html');
return doc.body.textContent || '';
}
// Plus fiable que les regex
const complexHtml = '<div>Texte avec <script>alert("danger")</script> et <style>body{color:red}</style></div>';
console.log(stripHtmlWithDOM(complexHtml)); // "Texte avec et "
Python avec BeautifulSoup
from bs4 import BeautifulSoup
def strip_html_tags(html):
soup = BeautifulSoup(html, 'html.parser')
return soup.get_text()
# Utilisation
html_content = "<p>Paragraphe avec <a href='#'>lien</a></p>"
clean_text = strip_html_tags(html_content)
print(clean_text) # "Paragraphe avec lien"
📊 Matrice de décision : regex ou parseur
| Critère | Regex | Parseur HTML |
|---|---|---|
| Simplicité | ✅ Très simple | ❌ Plus complexe |
| Fiabilité | ❌ Limitée | ✅ Très fiable |
| Performance | ✅ Rapide | ⚖️ Modérée |
| HTML complexe | ❌ Échoue | ✅ Gère tout |
| Dépendances | ✅ Aucune | ❌ Bibliothèques |
🎯 Recommandations finales
✅ Utilisez les regex quand :
- Le HTML est simple et bien formé
- Vous travaillez avec des données contrôlées
- La performance est critique
- Vous ne pouvez pas utiliser de bibliothèques externes
❌ Évitez les regex si :
- Le HTML contient du JavaScript ou CSS inline
- Vous traitez du HTML provenant du web
- La fiabilité est plus importante que la rapidité
- Le HTML contient des balises imbriquées complexes
❓ FAQ
Les expressions régulières peuvent-elles gérer tous les types de HTML ?
Non, les regex ont des limitations fondamentales avec le HTML complexe. Elles ne gèrent pas correctement les commentaires, les scripts, les styles inline ou les balises mal formées. Pour du HTML réel, utilisez un parseur dédié.
Quelle est la différence entre <[^>]+> et <.*?> ?
Le motif <[^>]+> est plus sûr car [^>]+ ne correspond qu’aux caractères qui ne sont pas >, évitant de matcher accidentellement plusieurs balises. Le motif <.*?> peut être moins prévisible avec du HTML malformé.
Comment gérer les entités HTML comme & ou < ?
Les regex pour supprimer les balises ne traitent pas les entités HTML. Vous devrez ajouter une étape supplémentaire pour décoder les entités ou utiliser un parseur HTML qui le fait automatiquement.
Est-ce que les regex fonctionnent avec du HTML minifié ?
Oui, les motifs regex fonctionnent généralement bien avec le HTML minifié car ils ne dépendent pas des espaces ou sauts de ligne. Cependant, testez toujours avec vos données réelles.
Peut-on utiliser les regex pour nettoyer du contenu copié depuis Word ?
Partiellement. Le contenu de Word contient souvent des balises propriétaires Microsoft et des styles complexes que les regex simples ne gèrent pas bien. Un parseur HTML ou des outils spécialisés comme Mammoth.js sont plus adaptés.