Программа Super Replacer. Пакетная обработка файлов, основное назначение - удаление баннеров и корректировка ссылок в скачанных сайтах. Качаем...

Super Replacer
справка к программе - online вариант

Содержание

Что это?

Программа предназначена для пакетной обработки текста (главным образом html) с использованием регулярных выражений. Основное назначение программы - очистка скачанных сайтов от баннеров, составление списков докачки и битых ссылок с частично скачанного сайта, подготовка текстовых файлов к преборазованию в html, перекодирование текста Windows-1251 / Koi8-r / OEM.

Возможности программы: поиск многострочных (!) последовательностей символов в тексте, замена одних последовательностей другими, использование шаблонов (масок) в формате регулярных выражений (синтаксис похож на регулярные выражения в Perl), составление файла отчета по результатам поиска/замены, сохранение шаблонов поиска и замены в файлах с последующим открытием этих файлов в программе (т.е. не нужно писать одни и те же шаблоны несколько раз, кроме того появляется возможность создания библиотек шаблонов), групповая обработка файлов по маске и размещению в директории с возможностью обхода поддиректорий, переименование файлов по маске с использованием регулярных выражений, корректировка ссылок с учетом переименования файлов, автоматическое распознавание кодировки, пакетная переаодировка между основными русскими кодировками (Windows-1251, koi8-r, OEM).

Программа находится в постоянной доработке. Сейчас получена более или менее законченная версия (она может ВСЕ что описано выше), ей присвоен номер 1.0 beta и она выложена на сайте http://matrix.rbcmail.ru. Новые версии будут появляться по мере внесения изменений и дополнений в программу.

Программа использует оригинальный движок разбора регулярных выражений, поиска и замены в файлах, написанный мной с нуля. Версия 1.0 beta зарекомендовала себя как достаточно стабильная, я обрабатывал ей достаточно большие (более 100M) сайты с достаточно сложной структурой и всегда обработка проходила правильно и без ошибок. Движок обладает достаточной гибкостью и расширяемостью (написан на C++ с использованием MFC), так что в следующих версиях будет много новых мощных и полезных функций.

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

С чего начать и как работать с программой?

Окно программы выглядит так:

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

С помощью кнопок "Добавить файлы" и "Добавить папку" можно сформировать задание для обработки; кнопка "Удалить" удаляет из задания выделенный путь к файлу или папке, кнопка "Очистить список" удаляет все пути к файлам или папкам.

Пример: вы хотите обработать скачанный с помощью программ типа Teleport Pro сайт - удалить из него все баннеры, счетчики, iframe и т.п. элементы, которые при открытии страницы или просят подключения к интернету (нередко более 10 раз!) или просто выглядят "дырами" вместо рисунков. Также вы хотите переименовать имена файлов типа "articles.asp-page=2&sort=3.htm" в нечто более понятное, например "art_2_3.htm" (это пример одной странички с сайта http://www.proglib.ru, которая попалась мне сейчас когда я пишу это описание; яркий пример того, с чем приходится иметь дело).

Итак, добавляем ее в задание через кнопку "Добавить файлы". Далее нужно определить маски файлов для обработки. Это связано с тем, что в скачанных сайтах как правило кроме html страниц есть также большое количество графики, архивов и т.д., а также с необходимостью переименования некоторых файлов (например, для дальнейшей записи на болванку).

Переходим на вторую страничку программы (на скриншоте уже введены те данные которые предлагается ввести в примере):

Немного о формате задания масок файлов. Доступны два формата: DOS-like format и RegExp format. Первый похож на формат масок DOS и Windows (используется только два символа * и ?), второй - на регулярные выражения Perl (возможности которых гораздо шире, но и составление сложнее). Если галочка "Использовать сложные шаблоны" установлена, то используется RegExp, иначе DOS-like.

Нам понадобится сложный формат RegExp. Смотрим внимательно на имя файла articles.asp-page=2&sort=3.htm и на имена других файлов скачанного сайта, например в Windows Commander'e:

Первая маска - для файлов содержащих "sort=". Выглядит она так:
articles\.asp-page=</d+>&sort=</d+>\.htm
Нам нужно переименовать файл, поэтому ставим галочку "Переменовать в" и в поле "Переименовать в" вводим маску замены:
art_<0>_<1>.htm
В результате файл articles.asp-page=2&sort=3.htm переименуется в art_2_3.htm и т.д. В этом можно убедиться, вставив имя файла в поле "Проверка имени файла" и нажав кнопку "Проверить" - появится окно с сообщением что "строка соответствует шаблону" и вместо старого имени файла в поле "Имя файла" появится результат переименования.

Нажимаем кнопку "Добавить->". Маски поиска и переименования добавятся в список масок и будут использоваться при обработке проекта. Кнопкой "Очистить" можно очистить поля ввода масок, подготовив их тем самым к вводу следующих масок. Аналогично составляются и вводятся маски для остальных файлов.

Поскольку сайт - единое целое, то скорее всего на странички с именами типа articles.asp-page=2&sort=3.htm есть ссылки с других страниц. После переименования файлов ссылки окажутся битыми, и восстановить их будет крайне сложно. Чтобы этого не случилось, нужно одновременно с переименованием файлов заменить ссылки на них по всем html-страницам сайта. Для этого используется кнопка "Экспортировать в Замену". Выделите в списке строку с масками и нажимте эту кнопку - данная маска будет экспортирована в список строк замены (об этом далее). Вообще, можно сделать это сразу после добавления масок в список (добавляется содержимое полей ввода масок).

Кнопка "Удалить все" удаляет все маски из списка, "Удалить" - выделенную маску. Функции кнопок "В файл" и "Из файла" в данной версии НЕ РЕАЛИЗОВАНЫ, т.е. нажатие на эти кнопки ни к чему не приведет (я просто сделал их "серыми"). Если портебуется внести изненение в маску, то ее нужно выделить в списке - и она загружается в поля редактирования. После внесения изменений нажимте кнопку "Внести изменения" и изменения будут занесены в список, а значит во внутреннюю память программы.

Третья страничка "Поиск и замена" используется для задания строк поиска и замены по тексту.

В списке замены уже появилась строка, импортированная сюда из масок файлов ("imported0"). Если вы ввели маски для других имени экспортировали их сюда, то здесь будет несколько строк. Импортированные строки никак не связаны с масками файлов, т.е. их можно изменять также как другие строки замены. На масках изменения никак не отразятся.

На этой страничке доступны все элементы управления, кроме "Сброс", "Макс.размер" и "Макс. число". Эти элементы будут реализованы в следующих версиях программы. Остальные "серые" элементы разблокируются включением соответствующих им чекбоксов.

Сейчас нужно открыть страницу сайта в каком-нибудт текстовом редакторе (подойдет и Блокнот, но я обычно использую UltraEdit32). Для большого сайта достаточно открыть одну страницу - как правило, баннеры однотипные. Открываем и смотрим (нужно минимальное знание html).

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

Начало
<!-- BannerBank advertising begin: ClickHere1 --><SCRIPT
и конец
</SCRIPT><!-- BannerBank advertising end: ClickHere1 -->
Копируем эти строки и вставляем их соответствнно в поля "Начало" и "Конец" (предварительно разблокировав поле "Конец" соответствующим чекбоксом. Снимаем чекбокс "Это регулярные выражения", если он установлен. Поскольку это баннер, то нам нужно удалить его из кода html страницы. Поэтому разблокируем поле "Заменить". Поле оставляем пустым, т.к. нам вместо баннера ничего не нужно (для эксперимента можете написать туда строку "здесь был баннер" и увидите как программа заменяет строки).

Распознавание фрагментов по сигнатурам начала и конца - это мощнейшая особенность программы, не имеющая аналогов в других подобных программах.

Назначаем баннеру имя (например BannerBank или просто b1) и заносим его в поле имени (хотя это и не обязательно, но поскольку строки начала, конца и замены могут быть достаточно длинными, я решил ввести понятие "имя" и идентифицировать объекты замены по именам). Нажимаем кнопку "Добавить" - и имя баннера появляется в списке. Теперь его можно выбрать оттуда, внести изменения (которые вносятся во внутреннюю память нажатием кнопки "Применить"), удалить из списка ("Удалить"). Очистка всего списка осуществляется по нажатию кнопки "Удалить все". Кнопка "Очистить" очищает поля ввода баннера, подготавливая место для ввода следущих данных.

Аналигочно ищем и вводим другие баннеры. Вообще полезно удалять также и просто скритпы, если они используются не для навигации по странице (например, в примере странички есть скрипт определения типа браузера). Я их нашел как никогда много - целых 11 штук. Все они находятся в файле test.bnl [файл в архиве] (для корректного отображения в браузере я добавил расширение .txt). Это специальный файл для хранения сигнатур баннеров и строк замены. Сохранить баннеры, находящиеся в списке, можно используя кнопку "В файл...". Загрузить их можно через кнопку "Из файла...". Формат файла достаточно очевиден, но я не документирую его в открытой документции, т.к. возможны расширения формата.

Следует отметить, что при поиске как строк, так и регулярных выражений полностью игнорируются "пробельные" символы такие как пробел, табуляция, перенос строки. Это связано с тем что в html пробелы и переносы строк (кроме пробелов между словами текста и разделителей между тегами pre) также игнорируются. В строке замены пробелы сохраняются.

Предусмотрена также возможность создания файла отчета. Это один файл на весь проект, в который построчно добавляются строки из поля "Строка в отчет" (если оно активно) для объекта замены, если объект замены соответствует фрагменту текста (т.е. например если найден баннер, то можно добавить информацию о нем или даже код этого баннера в файл отчета). Наиболее естественное использование файла отчета - составление списков ссылок и e-mail адресов, имеющихся на сайте. Для примера найдем все гиперссылки с исследуемой странички. Добавим в поле "Начало" такой код:
\<a href="</u+>"
а в поле "Строка в отчет" - такой:
URL = <0>
Включим "Это регулярные выражения", остальные чекбоксы выключим. Назовем объект "href" и добавим его к списку.

Страничка "Разное" содержит панели управления кодировками, файлом отчета и безопасностью.

Кодировки оставим по умолчанию (если нужно преобразовать текст к другой кодировке, то она выбирается в группе "Целевая кодировка"; если исходная кодировка известна, то ее можно выбрать вручную; это ненамного сократит время обработки больших проектов). Внимание! Поиск и замена строк выполняются исключительно в кодировке windows-1251, так что если например сайт представлен в кодировке koi8-r, и в сигнатурах баннеров есть русские символы, необходимо обязательно поставить преобразование к windows-1251 (оно выполняется перед поиском и заменой баннеров).

Устновкой чекбокса "Создавать файл отчета" разблокируем поле ввода имени файла отчета и введем имя (например report.txt, как на скришноте). Можно указать полный путь к файлу.

В группе "Безопасность" можно установить опцию "только чтение" - при этом никаких изменений ни в какие файлы проекта вноситься не будет, даже если есть строки замены. Это может использоваться, например, если нужно только создать отчет, а не искать и удалять баннеры. Опция "Сохранять старые файлы (добавлять .bak)" позволяет не удалять старые файлы, а оставлять их, добавляя к ним расширение .bak. Способ рекомендуется применять к отдельным файлам, а не к директориям, потому что пока нет возможности удаления или перемещения всех файлов .bak из всех поддиректорий директории. Для резервного сохранения сайтов рекомендуется просто создавать их резервные копии или сжимать их в архивы перед обработкой.

Страничка "Справка" содержит справочную информацию и кнопки вызова этой справки и отправки мне письма по e-mail.

DOS-like регулярные выражения

Маски в стиле DOS содержат только два масочных символа:
RegCharDescription
* Любая последовательность символов, допустимая в имени файла, в т.ч. и пустая строка
? Любой символ, допустимый в имени файла
Расширение не выделяется отдельно, и в этом отличие от DOS wildcards: т.е. файл index.shtml.htm можно включить в задание, определив одну из масок *.shtml.htm или *.*.htm или *.shtml.* или *.*.* (хотя есть множество других решений), но не *.htm или *.* Количество точек в маске должно быть таким же как и в имени файла со всеми расширениями.

Для выделения фрагментов в подстроки используют символы < и >, например <*>.<*>.htm для файла index.shtml.htm в подстроке <0> будет "index", в подстроке <1> будет "shtml". Подстроки можно использовать для формирования новых имен файла. Для использования символов *, ?, <, > $ и \ как символов, а не как управляющих кодов, перед ними нужно поставить символ \ (символ $ сейчас зарезервирован на будущее).

RegExp Регулярные выражения

Регулярные выражения (Regular Expressions, RE) - это строки определенного формата, предназначенные для управляния специальными алгоритмами обработки текстовой информации. Простейшие регулярные выражения - это wildcard символы ОС DOS '*' и '?': символ '*' при поиске файла означает любую последовательность символов, символ '?' - любой отдельный символ. Наиболее развитые по возможностям RE включены в язык Perl, используемый в UNIX системах (хотя есть замечательные реализации и под Windows). В программе Super Replacer синтаксис регулярных выражений близок к синтаксису языка Perl, а в чем-то даже улучшен.

При работе с RE следует помнить что любая последовательность символов, не являющаяся шаблонной, рассматривается как обычная.

Синтаксис регулярных выражений в Super Replacer:

Маски.

Некоторые символы и группы символов при сравнении рассматриваются как маски, т.е. обозначают некоторые другие группы символов. Таблица масочных символов в Super Replacer:

RegCharDescription
. (точка) - любой символ
/dлюбая цифра от 0 до 9
/aлюбая буква латинского алфавита (A..Z,a..z)
/wлюбая буква латинского алфавита или цифра
/rлюбая буква русского алфавита
/iэлемент стандартного идентификатора (любая буква латинского алфавита, цифра или символ подчеркивания)
/jэлемент расширенного идентификатора (стандартный идентификатор или символ русского алфавита)
/sпробельный символ (пробел, табуляция, нулевой символ)
/cрасширенный пробельный символ (с переносами строки)
/nперенос строки
/tэлемент числа в формате float (цифра, +, -, точка, символ экспоненты 'e')
/gэлемент числа в формате integer (цифра, +, -)
/xшестнадцатеричная цифра (цифра или одна из букв a b c d e f A B C D E F)
/fсимвол, допустимый в имени файла (имеется в виду в Windows)
/eсимвол, допустимый в имени файла с раcширениями (добавляется точка)
/pсимвол, допустимый в полном имени файла (с диском и директориями, т.е. добавляются слэши и двоеточие)
/uсимвол, допустимый в полном URL (нет пробелов, одинарных кавычек, добавляется знак вопроса)
/qсимвол пунктуации

Масочные последовательности.

В ЭТОЙ ВЕРСИИ НЕ РЕАЛИЗОВАНЫ, СИМВОЛЫ '[' И ']' РАСПОЗНАЮТСЯ КАК УПРАВЛЯЮЩИЕ НО ВСЕ ЧТО МЕЖДУ НИМИ ИГНОРИРУЕТСЯ!

В некоторых случаях стандартных масок недостаточно. Тогда имеет смысл создать свою маску путем перечисления символов, которые должны входить (или не входить) в маску. Делается это следующим образом:

Модификаторы повторения.

Часто нужно закодировать не один символ, а сразу несколько (как правило неизвестно сколько точно!). В таких случаях применяют модификаторы повторения, которые ставятся сразу после символа, маски или масочной последовательности. Входной язык Super Replacer предоставляет следующие модифткаторы:
? Один или ни одного символа. Программа сравнит очередной символ с маской, и если он соответствует маске, то символ засчитается, если же нет, то маска просто игнорируется и берется следующая маска. Например, строка 'x12' соответствует маске '/a?/u?12'
+ Один или более символов. Программа будет сравнивать символы из потока данных с этой маской до тех пор, пока не попадется первый несоответствующий символ. Но при этом хотя бы один символ должен соответстовать маске, иначе будет считаться что маска не соответствует входной строке данных. Так, '/d+' это любое десятичное число, а '/a+' - любое слово из латинских букв.
* Ни одного или более символов. Программа будет сравнивать символы из потока данных с этой маской до тех пор, пока не попадется первый несоответствующий символ. Но если первый же символ не будет соответствовать маске, программа просто пропустит маску и возьмет следующую. Например, RE 'X/d*X' соответствует строкам 'XX', 'X1X', 'X12345X' и т.д.

Формирование подстрок.

Для целей формирования строк замены (об этом дальше) из строки можно выделять подстроки. Для того, чтобы часть строки была занесена в список подстрок, соответствующую часть регулярного выражения заключают в угловые скобки. Следует помнить, что вложенные подстроки в SuperReplacer не поддерживаются, так что после открывающей скобки должна быть закрывающая. Примеры формирования подстрок: при сопоставлении RE "x</a+>12<kkk>z" со строкой "xqwerty12kkkz" формируются две подстроки: первая "qwerty" и вторая "kkk". Подстроки нумеруются с нуля, их количество в принципе неограничено, но нулевая строка - это пустая строка, которая подставляется в тех случаях, когда не удалось правильно определить номер подстроки.

Формирование строк по результатам разбора. Если строка и RE соответствуют друг другу, то по результатам сопоставления (подстрокам и дополнительной информации) можно сгенерировать строки замены и записи в отчет. Для этого используются специальные маски замены, строящиеся по следующим правилам:

Таблица макроинформационных подстрок
В ЭТОЙ ВЕРСИИ НЕ РЕАЛИЗОВАНЫ, РАСПОЗНАЮТСЯ КАК УПРАВЛЯЮЩИЕ НО КАКОГО ДЕЙСТВИЯ НЕ ПРОИЗВОДЯТ!
$FИмя текущего файла
$PПуть к текущему файлу
$CПуть к текущей директории, заканчивающийся символом /
$AТекущая кодировка (windows-1251,koi8-r,cp866,detect если другая)
$YТекущий год (две последние цифры)
$MТекущий месяц (01..12)
$DТекущий день (01..31)
$WТекущий день недели (mon,tue,...)
$hТекущий час (00..23)
$mТекущая минута (00..59)
$sТекущая секунда (00..59)
$IПорядковый номер файла в списке обработки (это не список файлов и директорий, доступный на первой страничке программы, а внутренний список всех файлов, подлежащих обработке)
$JПорядковый номер файла в данной директории
$RСлучайное число в диапазоне uint32
$UУникальное в рамках текущей сессии число

Следует отметить, что для номеров доступно форматирование в стиле функции printf: если после символа $ указать число, то для числовых параметров число будет дополнено нулями до указанного количества знаков, для текстовых параметров произойдет аналогичное дополнение пробелами слева. Также можно выбирать формат представления чисел (десятичный или шестнадцатеричный)

$2N сформирует числа 00,01,02 вместо 0,1,2.

$2xN сформирует числа 0A,0B,0C вместо 10,11,12 (шестнадцатеричный формат)

Дополнительная информация

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

Все пожелания и предложения, в т.ч. и по улучшению программы, также высылайте мне на мыло.

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

(C) Dark Tiger, 2003

Hosted by uCoz