2016-04-05 2 views
2

У меня есть сотни файлов (древний ASP и HTML), заполненный устаревшим и часто полностью недействительным кодом HTML.Регулярные выражения для исправления недействительных HTML

Между Visual Studio и ReSharper этот недопустимый HTML помечен и легко отображается, если окно редактора прокручивается туда, где отображается недопустимый HTML. Однако ни один из инструментов не предоставляет какой-либо метод для быстрого исправления ошибок во всем проекте.

Первые несколько ошибок, на которые ReSharper фокусирует мое внимание, являются тегами, которые либо не закрыты, либо закрыты, но не открыты. Иногда это происходит потому, что открывающие и закрывающие теги перекрываются - например:

<font face=verdana size=5><b>some text</font></b> 

<span><p>start of a paragraph 
    with multiple lines of <i><b>text/hmtl 
    </i> with a nice mix of junk</b> 
</span></p> 

Иногда открывающие теги без соответствующего закрывающего тега, были разрешены в старых версиях HTML (или инструменты, которые генерировали HTML, не все равно о стандартах, поскольку некоторые браузеры обычно выяснили, что имел в виду автор). Таким образом, беспорядок, который я пытаюсь очистить, имеет множество закрытых HTML-тегов, которые должны быть закрыты.

<font face = tahoma size=2>some more text<b><sup>*</sup></b> 
... 
... 
</body> 
</html> 

И только для хорошей меры код содержит множество закрывающих HTML-тегов, которые не имеют соответствующего начального тега.

</b><p>some text that is actually within closed tags</p> 
</td> 
</tr> 
</table> 

Так, кроме написания нового приложения для разбора, флага, и исправить все эти ошибки - кто-нибудь есть некоторые .Net регулярных выражения, которые могут быть использованы для обнаружения и предпочтительно исправить этот материал с Visual Studio 2012 в Поиске и заменить функцию?

Хотя одно выражение, которое делает все это было бы хорошо, несколько выражений, которые будут обрабатывать один из вышеуказанных случаев, все равно будут очень полезными.

Для случая перекрывающихся HTML тегов, я использую это выражение:

(?n)(?<t1s>(?><(?<t1>\w+)[^>]*>))(?<c1>((?!</\k<t1>>)(\n|.))*?)(?<t2s>(?><(?!\k<t1>)(?<t2>(?>\w+))[^>]*>))(?<c2>((?!(</(\k<t1>|\k<t2>)>))(\n|.))*?)(?<t1e></\k<t1>>)(?<c3>(?>(\n|.)*?))(?<t2e></\k<t2>>) 

Explanation: 
    (?n) Ignore unnamed captures. 
    (?<t1s>(?><(?<t1>\w+)[^>]*>)) Get the first tag, capturing the full tag and attributes 
     for replacement and the name alone for further matching. 
    (?<c1>((?!</\k<t1>>)(\n|.))*?) Capture content between the first and second tag. 
    (?<t2s>(?><(?!\k<t1>)(?<t2>(?>\w+))[^>]*>)) Get the 2nd tag, capturing the full 
     tag and attributes for replacement, the name along for further matching, and ensuring 
     it does not match the 1st tag and that the first tag is still open. 
    (?<c2>((?!(</(\k<t1>|\k<t2>)>))(\n|.))*?) Capture content between the second tag 
     closing of the first tag. 
    (?<t1e></\k<t1>>) Capture the closing of the first tag, where the second tag is 
     still open. 
    (?<c3>(?>(\n|.)*?)) Capture content between the closing of the first tag and the closing 
     of the second tag. 
    (?<t2e></\k<t2>>) Capture the closing of the second tag. 

С помощью этого выражения замены:

${t1s}${c1}${t2s}${c2}${t2e}${c3}${t1e} 

Проблемы с этим запросом выражением является то, что это мучительно медленно , Использование . вместо (\n|.) для трех захватов контента намного быстрее, но ограничивает результаты только теми, где перекрывающиеся теги и промежуточный контент находятся в одной строке.

Выражение также будет соответствовать действительным, правильно закрытой и правильно вложенную HTML, если первый тег появляется в содержании второго тега, например:

<font color=green><b>hello world</b></font><span class="whatever"><font color=red>*</font></span> 

Так что это не безопасно использовать выражение в операция «Заменить все», особенно в сотнях файлов в решении.

Для незакрытых тегов, я успешно обрабатываются самозакрывающиеся теги: <img/>, <meta/>, <input/>, <link/>, <br/> и <hr/>. Тем не менее, я все еще не пытался использовать общий тег для всех других тегов - те, которые могут иметь контент или должны быть закрыты с помощью отдельного закрывающего тега.

Кроме того, я понятия не имею, как совместить закрывающие теги без подходящего открытого тега.Простое решение </\w+> будет соответствовать всем закрывающим тегам независимо от того, имеет ли они соответствующий тег открытия.

+1

Есть некоторые инструменты, специально предназначенные для обработки «суп-суп» - например [пакет гибкости HTML] (https://www.nuget.org/packages/HtmlAgilityPack). Вам нужно будет создать код, чтобы указать его на все соответствующие файлы, но это может вам помочь :) в любом случае, просто мысль –

+1

Не * недействительна * HTML-контекст? – Laurel

+0

@Laurel - да, хотя я пытаюсь обновить этот беспорядок на что-то, соблюдая последние стандарты HTML, а не те, что IE IE принял в прошлом. – Zarepheth

ответ

1

Согласно их веб-сайт, Resharper имеет эту функцию:

Solution-Wide Анализ

не только ReSharper способен анализировать конкретный файл кода на наличие ошибок, но он может расширить свои навыки анализа на покрыть все ваше решение.

...

Все, что вам нужно сделать, это явно переключатель Solution-Wide Анализ на, а затем, после того, как он анализирует код вашего решения, просмотреть список ошибок в выделенном окне :

[Many errors here]

Даже без открытия этого окна, вы можете легко перемещаться по ошибки в вашем решении с Переходом к следующей Ошибке в растворе ( Сдвига + Alt + PageDown) и перейти к предыдущей ошибке в растворе ( сдвига + Alt + F12) команда.

Ваше текущее «решение» является использование регулярных выражений на контекстно-чувствительной языка (недействительный HTML). Пожалуйста, нет. Люди отбрасываются уже тогда, когда люди предлагают разбор контекстно-бесплатные языки с регулярными выражениями.

С другой стороны, может быть решение, для которого мы можем использовать регулярные выражения.

Для этого HTML:

<i><b>text/html 
</i> with a nice mix of junk</b> 

Лучше преобразование было бы (это больше действует, верно?):

<i><\i><b><i>text/hmtl 
</i> with a nice mix of junk</b> 

Есть много способов это может пойти не так, (хотя это очень плохо as-is), но я предполагаю, что у вас все это подкреплено. Это регулярное выражение (где i пример тега вы можете захотеть сделать это с):

<(i(?: [^>]+)?)>([^<]*)<(\/?[^i](?: [^>]+)?)> 

может помочь вам. Я не знаю, как заменить регулярное выражение на любой вкус, который вы используете, но если вы замените $ 0 (все, что соответствует регулярному выражению) с <$1>$2</$1><$3><$1>, вы получите преобразование, о котором я говорю.

+0

По какой-то причине набор функций ReSharper 8 немного ограничен классическим ASP ... Многие из функций Я считаю полезным использовать C#, которые недоступны или недоступны. Например, полезные предложения при появлении контекстного меню ReSharper по ошибке с флагом могут иметь возможность удалить оскорбительный тег, но часто все, что у него есть, - это выбор игнорировать ошибки. – Zarepheth

+0

Тем не менее, предложение об обзоре функции ReSharper * полезно, так как мне трудно найти список ошибок ReSharper, и теперь у меня это передо мной, что ускоряет мою работу. – Zarepheth

+0

Ну, это окно с ошибками позволило мне быстро исправить некоторые JavaScript и CSS в проекте, но все же есть некоторые большие файлы с неприятными беспорядками HTML. – Zarepheth

Смежные вопросы