export function sanitizeHtml(html: string): string {
html = html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, "");
html = html.replace(/\s*on\w+\s*=\s*[^>]*/gi, "");
html = html.replace(/javascript:/gi, "");
html = html.replace(/data:(?!image\/(png|jpg|jpeg|gif|svg|webp))[^"'\s>]*/gi, "");
html = html.replace(/<(iframe|object|embed|applet|link|meta)\b[^>]*>/gi, "");
html = html.replace(/<\/(iframe|object|embed|applet|link|meta)>/gi, "");
html = html.replace(/<\/?form\b[^>]*>/gi, "");
html = html.replace(/<(input|button|textarea)\b[^>]*>/gi, "");
html = html.replace(/href\s*=\s*["']([^"']*)["']/gi, (match, url) => {
const trimmedUrl = url.trim().toLowerCase();
if (trimmedUrl.startsWith("http://") ||
trimmedUrl.startsWith("https://") ||
trimmedUrl.startsWith("mailto:") ||
trimmedUrl.startsWith("#") ||
trimmedUrl.startsWith("/")) {
return match;
}
return "href=\"#\"";
});
html = html.replace(/src\s*=\s*["']([^"']*)["']/gi, (match, url) => {
const trimmedUrl = url.trim().toLowerCase();
if (
trimmedUrl.startsWith("http://") ||
trimmedUrl.startsWith("https://") ||
trimmedUrl.startsWith("data:image/") ||
trimmedUrl.startsWith("/")) {
return match;
}
return "src=\"\"";
});
return html;
}