Нахождение искаженного XHTML с помощью Javascript - PullRequest
0 голосов
/ 11 июня 2009

Есть ли у кого-нибудь хороший способ узнать, содержит ли строка искаженный 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>

переключить все заглавные теги обратно на строчные

Предусматриваются ли какие-либо проблемы немедленно, кроме факта, что это займет значительное количество времени?

Ответы [ 2 ]

0 голосов
/ 11 июня 2009

Так происходит ли генерация HTML на стороне клиента? Лучше всего проверить сгенерированную разметку в самом источнике.

Если нет, возможно, есть способ запрограммировать валидатор W3C.

http://validator.w3.org/#validate_by_input

см. Также http://www.w3.org/QA/Tools/

0 голосов
/ 11 июня 2009

Я делаю это на сервере с HTMLTidy

htmltidy -asxhtml
...