То, что вы просите, звучит как работа для регулярных выражений. Многие редакторы поддерживают поиск / замену регулярных выражений. Лично я, вероятно, сделал бы это из командной строки с Perl (sed также работал бы), но это только я.
perl -pe 's|<([^\s>]+)[^>]*></\1>||g' < file.html > new_file.html
или, если вы смелы, отредактируйте файл на месте:
perl -pe 's|<([^\s>]+)[^>]*></\1>||g' -i file.html
Это удалит:
<p></p>
<p id="foo"></p>
но не:
<p>hello world</p>
<p></a>
Предупреждение: такие вещи, как <img src="pic.png"></img>
и <br></br>
также будут удалены. Это не очевидно из вашего вопроса, но я предполагаю, что это нежелательно. Возможно, вы не беспокоитесь, потому что знаете, что все ваши изображения объявлены так: <img src="pic.png"/>
. В противном случае регулярное выражение нужно будет изменить, чтобы учесть это, но я решил начать с простого для более простого объяснения ...
Он работает путем сопоставления открывающего тега: литерал <
, за которым следует имя тега (один или несколько символов, которые не являются пробелами или >
= [^\s>]+
), любые атрибуты (ноль или более символов, которые не являются ' t >
= [^>]*
), а затем литерал >
; и закрывающий тег с тем же именем: это использует тот факт, что мы захватили имя тега, поэтому мы можем использовать обратную ссылку = </\1>
. Затем совпадения заменяются пустой строкой.
Если используемый здесь синтаксис / терминология вам незнаком, я являюсь поклонником страницы документации perlre . Синтаксис регулярных выражений в других языках должен быть очень похож, если не идентичен этому, так что, надеюсь, это будет полезно, даже если вы не используете Perl:)
О, еще одна вещь. Если у вас есть такие вещи, как <div><p></p></div>
, они не будут собраны все сразу. Вам нужно будет сделать несколько проходов: первый удалит <p></p>
, оставляя <div></div>
для удаления вторым. В Perl оператор подстановки возвращает количество выполненных замен, поэтому вы можете:
perl -pe '1 while s|<([^\s>]+)[^>]*></\1>||g' < file.html > new_file.html