Возможно, Marpa::HTML
поможет вам. Прочитайте некоторые интересные способности, которые есть у него на блоге автора об этом . Суть в том, что синтаксический анализатор работает с интерпретатором (я, вероятно, получаю неверную семантику), чтобы выяснить, что должно присутствовать, исходя из того, что МОЖЕТ присутствовать в определенном логическом месте кода.
Приведенные здесь примеры исправляют подобные проблемы, с которыми вы, похоже, сталкиваетесь гораздо более последовательно, чем с помощью регулярных выражений, которые неизбежно пострадают от крайних случаев.
Marpa::HTML
поставляется с утилитой командной строки, построенной с использованием модуля под названием html_fmt
. Это реализует механизм синтаксического анализа, чтобы исправить и распечатать html. Вот пример. Если 'bad.html' содержит <p>foo<p>bar</p>foo</p>
, то html_fmt bad.html
дает:
<!-- Following start tag is replacement for a missing one -->
<html>
<!-- Following start tag is replacement for a missing one -->
<head>
</head>
<!-- Preceding end tag is replacement for a missing one -->
<!-- Following start tag is replacement for a missing one -->
<body>
<p>
foo
</p>
<!-- Preceding end tag is replacement for a missing one -->
<p>
bar
</p>
foo
<!-- Next line is cruft -->
</p>
</body>
<!-- Preceding end tag is replacement for a missing one -->
</html>
<!-- Preceding end tag is replacement for a missing one -->