У меня есть сотни файлов (древний 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+>
будет соответствовать всем закрывающим тегам независимо от того, имеет ли они соответствующий тег открытия.
Есть некоторые инструменты, специально предназначенные для обработки «суп-суп» - например [пакет гибкости HTML] (https://www.nuget.org/packages/HtmlAgilityPack). Вам нужно будет создать код, чтобы указать его на все соответствующие файлы, но это может вам помочь :) в любом случае, просто мысль –
Не * недействительна * HTML-контекст? – Laurel
@Laurel - да, хотя я пытаюсь обновить этот беспорядок на что-то, соблюдая последние стандарты HTML, а не те, что IE IE принял в прошлом. – Zarepheth