Как удалить все пустые теги в коде X / HTML за один раз? - PullRequest
2 голосов
/ 20 марта 2010

например: Я хочу удалить все выделенные теги альтернативный текст http://shup.com/Shup/299976/110220132930-My-Desktop.png

Ответы [ 3 ]

1 голос
/ 20 марта 2010

Если речь идет только о быстром редактировании файла, и ваш редактор поддерживает замену регулярных выражений, вы можете использовать регулярное выражение, например:

<[^>]+></[^>]+>

Найдите это регулярное выражение и замените его пустой строкой.

Примечание: Это ни в коем случае не безопасно - не полагайтесь на это, поскольку оно может найти больше вещей, чем просто действительные, пустые теги. (Например, он также найдет <a></b>.) Не существует безопасного способа сделать это с помощью регулярных выражений - но если вы проверите каждую замену вручную, у вас все будет хорошо. Если вам нужна настоящая безопасная замена, то либо вам придется найти редактор, который поддерживает это (JEdit может быть хорошей ставкой, но я не проверял), либо вам придется анализировать файл самостоятельно, например используя XSLT.

0 голосов
/ 20 марта 2010

То, что вы просите, звучит как работа для регулярных выражений. Многие редакторы поддерживают поиск / замену регулярных выражений. Лично я, вероятно, сделал бы это из командной строки с 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
0 голосов
/ 20 марта 2010

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

<(?!\!|input|br|img|meta|hr)[^/>]*?>[\s]*?</[^>]*?>

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

<(?!\!|input|br|img|meta|hr)[^/>]*?></[^>]*?>

будет путь.

Обновление: Вы также хотите удалить & nbsps:

<(?!\!|input|br|img|meta|hr)[^/>]*?>(?:[\s]|&nbsp;)*?</[^>]*?>

Я не проверял это - все должно быть хорошо, попробуйте: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...