Отредактируйте множество HTML-файлов с помощью Regex, пустой alt-тег один раз в 'img src', встречающийся дважды - PullRequest
0 голосов
/ 26 июня 2011

Для начала, чтобы быть понятным, я использую Regex для редактирования существующего кода HTML во многих файлах, а НЕ для анализа HTML.

Резюме: проблема, с которой мне приходится сталкиваться, заключается в том, что содержимое alt-тега в img src удаляется. Это около 4500 HTML-файлов.

Вот мой фактический пример существующей разметки HTML:

<!-- End Bottom Bar --><img src="image/sdim0490.jpg" alt="sdim0490.jpg" border="0" width="1" height="1" /><!-- Google Analytics Script -->

Что мне нужно сделать, так это удалить содержимое alt-Tag, чтобы оно было пустым. В разных папках затрагивается около 4500 html-страниц. Я использую Notepad ++, который позволяет редактировать файлы, содержащиеся в папке, с помощью Regex.

Самая сложная проблема для меня состоит в том, что на каждой HTML-странице есть как минимум 2 тега для 'img src', но мне нужно отредактировать только один из них, фактически последний его случай.

Один конкретный тег 'img src' вложен между двумя тегами комментариев, как показано в примере выше, то есть в случае редактирования ВСЕХ страниц. Но есть, но иногда есть дополнительная или даже более пустая строка (и) выше и / или ниже комментариев. Я знаю, что это не делает это проще. Но в каждом случае есть оба комментария, как указано выше и ниже. Конечно, содержимое alt-тега меняется с каждой html-страницей и никогда не бывает одинаковым и уникальным для каждой редактируемой страницы.

Результат после применения regex-edit должен выглядеть следующим образом:

 <!-- End Bottom Bar --><img src="image/sdim0490.jpg" alt="" border="0" width="1" height="1" /><!-- Google Analytics Script --> 

Не имеет значения, удаляются ли лишние пустые строки выше и / или ниже или нет. Важно только то, что alt-тег пуст.

Надеюсь, вы поможете мне создать регулярное выражение, которое НЕ повлияет на другие теги img src в разметке.

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

Вы можете задаться вопросом, почему я устанавливаю ширину и высоту в «1». Ну, я использую эту технику, чтобы предварительно загрузить следующее изображение для просмотра, которое имеет значение для следующей страницы. Это может увеличить возможности просмотра для пользователя.

С нетерпением ждем некоторых отзывов.

Спасибо за внимание, Ганс.

ОБНОВЛЕНИЕ на мой вопрос:
Поразмыслив, я обнаружил, что у меня есть одно значение для поиска. Это: border = "0"
И это значение не нужно вообще. Таким образом, альтернативой может быть поиск этого и замена его, как показано ниже, включая предыдущее alt = "xyz":

replace: alt="xyz" border="0" with: alt=""

Это полностью послужило бы моему намерению.

Ответы [ 5 ]

1 голос
/ 26 июня 2011

Поскольку вы не хотите анализировать HTML-файлы, вы можете использовать регулярные выражения, чтобы делать то, что вы хотите.

На языке Python вот код программы, которая делает это:

import re

text = '''<img src="image/sdim0490.jpg" alt="bling" border="0" width="1" height="1" />
<!-- End
Bottom Bar -->
##############################
<img src="image/sdim0491.jpg" alt="bling" border="0" width="1" height="1" />
##############################
<!-- Google

Analytics    Script
-->
<img src="image/sdim0492.jpg" alt="bling" border="0" width="1" height="1" />'''

regx = re.compile('(<!--\s+End\s+Bottom\s+Bar\s+-->'
                  '.*?'
                  '<img\s+src="image/.+?"\s+alt=")(.*?)("\s+.*? />'
                  '.*?'
                  '<!--\s+Google\s+Analytics\s+Script\s+-->)',
                  re.DOTALL)

print regx.sub('\\1\\3',text)

результат

<img src="image/sdim0490.jpg" alt="bling" border="0" width="1" height="1" />
<!-- End
Bottom Bar -->
##############################
<img src="image/sdim0491.jpg" alt="" border="0" width="1" height="1" />
##############################
<!-- Google

Analytics

Script -->
<img src="image/sdim0492.jpg" alt="bling" border="0" width="1" height="1" />

\s эквивалентно [ \t\n\r\f\v]. Я заменил пробелы в шаблоне на \s+, чтобы учесть тот факт, что иногда в HTML-файлах теговые элементы разбиваются случайно расположенными символами новой строки. Этот факт часто используется противниками обработки файлов SGML / HTML / XML с помощью регулярных выражений, чтобы подтвердить, что такие файлы всегда должны обрабатываться парсером, с чем я не согласен. Обратите внимание, что в моем коде я предполагаю, что такие случайно расположенные строки могут встречаться между словами, но не в слове.

0 голосов
/ 18 февраля 2012

Более общее решение для тех, кто просто хочет найти любой тег img с непустым атрибутом alt, вы также можете использовать его в notepad ++:

(<img [^>]*alt=")[^"]+("[^>]*>)

Замените двойные кавычки на кавычки в коде, если это то, что вы используете, но вы не можете смешивать два в одном выражении из-за возможного случая "объекта персоны", где апостроф используется между двойными кавычками (или реже наоборот).

Тогда в поле замены вы будете использовать снимки, полученные из находки:

\1\2

Что делает поиск по регулярному выражению:

1.) Найти открытый тег img

2.) Убедитесь, что у него есть атрибут alt до закрытия тега img

3.) Убедитесь, что тег alt уже не пустой

Тогда замена просто игнорирует содержимое, которое было между кавычками, а вывод - пустой атрибут alt. С помощью нескольких модификаций вы можете найти пустые атрибуты alt и заполнить их, или заново заполнить их содержимым или другими вещами.

0 голосов
/ 27 июня 2011

Иногда хорошо, когда ты спишь.Сегодня утром у меня возникла идея, которая привела к решению с использованием Notepad ++ (кстати, это довольно приличный редактор).

Поскольку тег 'img src =' встречается как минимум дважды, я попытался найти шаблонэто уникально для рассматриваемого тега img src =.Ранее мне не приходило в голову, что конечная высота = «1» для рассматриваемого тега достаточно уникальна.При этом мне не нужно было принимать во внимание строки выше и ниже, как я предполагал изначально.Также я удалил рамку = ”0”, так как эти данные принадлежат CSS, а не разметке.Наконец, я получил искомую строку поиска и ввел ее следующим образом (Режим поиска: регулярное выражение, проверено)

Строки: Строка поиска:

alt="(.*).jpg"(.*)width="1" height="1" />

Заменить строку:

alt="" width="1" height="1" />

С результатом 3937 хитов Бинго.(поэтому мое предположение о сумме 4500 файлов было довольно близким).

0 голосов
/ 26 июня 2011

Вот команда sed для очистки alts в тегах img для всех html-файлов:

sed -i '' -e 's/(<img[^>]*?)alt="[^"]*"/$1alt=""/g' /somepath/*.html
0 голосов
/ 26 июня 2011

Вот регулярное выражение ... конечно, html-парсер имеет явные преимущества.Было бы интересно посмотреть, что быстрее.Мои деньги на регулярное выражение.Скорее всего, ремонтопригодность переходит к анализатору html.

string input =@"<img src=""image/sdim0490.jpg"" alt=""bling"" border=""0"" width=""1"" height=""1"" />  <!-- End Bottom Bar --><img src=""image/sdim0490.jpg"" alt=""bling"" border=""0"" width=""1"" height=""1"" /><!-- Google Analytics Script -->  <img src=""image/sdim0490.jpg"" alt=""bling"" border=""0"" width=""1"" height=""1"" />";
string pattern = @"(?<=\<!-- End Bottom Bar --><img[^>]+alt="")([^""]*)(?="".*<!-- Google Analytics Script -->)";
string html = Regex.Replace (input, pattern, "", RegexOptions.IgnoreCase);
...