Есть ли у кого-нибудь хороший способ узнать, содержит ли строка искаженный XHTML с использованием Javascript?
Поскольку моя страница позволяет сгенерированному пользователем возвращаемому XHTML-файлу (пользователи могут доверять) и внедряет его в DOM, я хочу проверить, есть ли незакрытые или чрезмерно закрытые теги, и закодировать их как <
и >
, чтобы они просто отображали ошибки в виде текста. Таким образом, все действительные xhtml будут по-прежнему отображаться, а недействительные просто станут текстовыми узлами, что позволит сценарию по крайней мере продолжить работу с ошибками.
Вот аналогичный метод, который я сделал, но он довольно грубый. У него другое назначение (простое удаление всех допустимых тегов xhtml и оставление остальных. Он работает путем рекурсивного выбора большинства внутренних тегов и их удаления.
stripHTML: function(html) {
var validXHTML = /<(\S+).*>(.*?)<\/\1>/i;
var validSelfClose = /<(input|img|br|hr)[^>]*\/>/gi;
html = html.replace(validSelfClose, '');
if(validXHTML.test(html)) {
var loc = html.search(validXHTML);
var str = html.match(validXHTML);
html = html.substr(0, loc) +
strings.addPunctuation(html.substr(loc, str[0].length).replace(validXHTML, '$2')) +
html.substr((loc+str[0].length), html.length);
if(validXHTML.test(html)) {
html = strings.stripHTML(html);
} else {
return html;
}
}
return html;
}
Не стесняйтесь улучшать вышеупомянутое, или ответьте на фактический вопрос.
Обновление
Моя идея о простом способе хотя бы приспособления большинства случаев такова:
кодировать все> и <не закрывать и не открывать ничего, </p>
изменить все имена тегов внутри <> на строчные
работает рекурсивно, начните с самых внутренних тегов, измените их с строчных на прописные <li>something</li>
становится <LI>something</LI>
после завершения рекурсии уберите все остальные> и <</p>
переключить все заглавные теги обратно на строчные
Предусматриваются ли какие-либо проблемы немедленно, кроме факта, что это займет значительное количество времени?