function validateHTML(html) {
try {
const parser = new DOMParser();
const doc = parser.parseFromString(html, 'text/html');
// Check for basic structural errors
if (doc.documentElement.nodeName !== 'HTML') {
return { errors: [{ message: 'Document must be an HTML document' }] };
}
// Check for required elements (e.g., head, body)
if (!doc.querySelector('head') || !doc.querySelector('body')) {
return { errors: [{ message: 'Missing required elements (head or body)' }] };
}
//Check for invalid/missing attributes
const elements = doc.getElementsByTagName('*');
for (let i = 0; i < elements.length; i++) {
const element = elements[i];
if (element.hasAttributes) {
for (let j = 0; j < element.attributes.length; j++) {
const attr = element.attributes[j];
if (!/^[a-zA-Z0-9._-]+$/.test(attr.name)) {
return { errors: [{ message: `Invalid attribute name: ${attr.name}` }] };
}
}
}
}
// Check for common invalid HTML tags. Extend as needed.
const invalidTags = ['iframe', 'object', 'embed'];
for (let i = 0; i < invalidTags.length; i++) {
if (doc.querySelector(invalidTags[i])) {
return { errors: [{ message: `Invalid tag: ${invalidTags[i]}` }] };
}
}
// Check for invalid doctype declaration (basic check)
const doctype = doc.querySelector('<!DOCTYPE html>').textContent;
if (!doctype.startsWith('<!DOCTYPE html>')) {
return { errors: [{ message: 'Invalid doctype declaration' }] };
}
return { errors: [] }; // No errors found
} catch (error) {
return { errors: [{ message: `Parsing error: ${error.message}` }] };
}
}
Add your comment