Программа предназначена для пакетной обработки текста (главным образом 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 есть ссылки с других страниц. После переименования файлов ссылки окажутся битыми, и восстановить их будет крайне сложно. Чтобы этого не случилось, нужно одновременно с переименованием файлов заменить ссылки на них по всем html-страницам сайта. Для этого используется кнопка "Экспортировать в Замену". Выделите в списке строку с масками и нажимте эту кнопку - данная маска будет экспортирована в список строк замены (об этом далее). Вообще, можно сделать это сразу после добавления масок в список (добавляется содержимое полей ввода масок).
Кнопка "Удалить все" удаляет все маски из списка, "Удалить" - выделенную маску. Функции кнопок "В файл" и "Из файла" в данной версии НЕ РЕАЛИЗОВАНЫ, т.е. нажатие на эти кнопки ни к чему не приведет (я просто сделал их "серыми"). Если портебуется внести изненение в маску, то ее нужно выделить в списке - и она загружается в поля редактирования. После внесения изменений нажимте кнопку "Внести изменения" и изменения будут занесены в список, а значит во внутреннюю память программы.
Третья страничка "Поиск и замена" используется для задания строк поиска и замены по тексту.
В списке замены уже появилась строка, импортированная сюда из масок файлов ("imported0"). Если вы ввели маски для других имени экспортировали их сюда, то здесь будет несколько строк. Импортированные строки никак не связаны с масками файлов, т.е. их можно изменять также как другие строки замены. На масках изменения никак не отразятся.
На этой страничке доступны все элементы управления, кроме "Сброс", "Макс.размер" и "Макс. число". Эти элементы будут реализованы в следующих версиях программы. Остальные "серые" элементы разблокируются включением соответствующих им чекбоксов.
Сейчас нужно открыть страницу сайта в каком-нибудт текстовом редакторе (подойдет и Блокнот, но я обычно использую UltraEdit32). Для большого сайта достаточно открыть одну страницу - как правило, баннеры однотипные. Открываем и смотрим (нужно минимальное знание html).
На скриншоте выделен код одного из многочисленных баннеров. Код с точки зрения распознвания достаточно сложный, но в начале и конце баннера есть достаточно очевидные строки сигнатур:
Начало
<!-- BannerBank advertising begin: ClickHere1 --><SCRIPT |
</SCRIPT><!-- BannerBank advertising end: ClickHere1 --> |
Распознавание фрагментов по сигнатурам начала и конца - это мощнейшая особенность программы, не имеющая аналогов в других подобных программах.
Назначаем баннеру имя (например BannerBank или просто b1) и заносим его в поле имени (хотя это и не обязательно, но поскольку строки начала, конца и замены могут быть достаточно длинными, я решил ввести понятие "имя" и идентифицировать объекты замены по именам). Нажимаем кнопку "Добавить" - и имя баннера появляется в списке. Теперь его можно выбрать оттуда, внести изменения (которые вносятся во внутреннюю память нажатием кнопки "Применить"), удалить из списка ("Удалить"). Очистка всего списка осуществляется по нажатию кнопки "Удалить все". Кнопка "Очистить" очищает поля ввода баннера, подготавливая место для ввода следущих данных.
Аналигочно ищем и вводим другие баннеры. Вообще полезно удалять также и просто скритпы, если они используются не для навигации по странице (например, в примере странички есть скрипт определения типа браузера). Я их нашел как никогда много - целых 11 штук. Все они находятся в файле test.bnl [файл в архиве] (для корректного отображения в браузере я добавил расширение .txt). Это специальный файл для хранения сигнатур баннеров и строк замены. Сохранить баннеры, находящиеся в списке, можно используя кнопку "В файл...". Загрузить их можно через кнопку "Из файла...". Формат файла достаточно очевиден, но я не документирую его в открытой документции, т.к. возможны расширения формата.
Следует отметить, что при поиске как строк, так и регулярных выражений полностью игнорируются "пробельные" символы такие как пробел, табуляция, перенос строки. Это связано с тем что в html пробелы и переносы строк (кроме пробелов между словами текста и разделителей между тегами pre) также игнорируются. В строке замены пробелы сохраняются.
Предусмотрена также возможность создания файла отчета. Это один файл на весь проект, в который построчно добавляются строки из поля "Строка в отчет" (если оно активно) для объекта замены, если объект замены соответствует фрагменту текста (т.е. например если найден баннер, то можно добавить информацию о нем или даже код этого баннера в файл отчета). Наиболее естественное использование файла отчета - составление списков ссылок и e-mail адресов, имеющихся на сайте. Для примера найдем все гиперссылки с исследуемой странички. Добавим в поле "Начало" такой код:
\<a href="</u+>" |
URL = <0> |
Страничка "Разное" содержит панели управления кодировками, файлом отчета и безопасностью.
Кодировки оставим по умолчанию (если нужно преобразовать текст к другой кодировке, то она выбирается в группе "Целевая кодировка"; если исходная кодировка известна, то ее можно выбрать вручную; это ненамного сократит время обработки больших проектов). Внимание! Поиск и замена строк выполняются исключительно в кодировке windows-1251, так что если например сайт представлен в кодировке koi8-r, и в сигнатурах баннеров есть русские символы, необходимо обязательно поставить преобразование к windows-1251 (оно выполняется перед поиском и заменой баннеров).
Устновкой чекбокса "Создавать файл отчета" разблокируем поле ввода имени файла отчета и введем имя (например report.txt, как на скришноте). Можно указать полный путь к файлу.
В группе "Безопасность" можно установить опцию "только чтение" - при этом никаких изменений ни в какие файлы проекта вноситься не будет, даже если есть строки замены. Это может использоваться, например, если нужно только создать отчет, а не искать и удалять баннеры. Опция "Сохранять старые файлы (добавлять .bak)" позволяет не удалять старые файлы, а оставлять их, добавляя к ним расширение .bak. Способ рекомендуется применять к отдельным файлам, а не к директориям, потому что пока нет возможности удаления или перемещения всех файлов .bak из всех поддиректорий директории. Для резервного сохранения сайтов рекомендуется просто создавать их резервные копии или сжимать их в архивы перед обработкой.
Страничка "Справка" содержит справочную информацию и кнопки вызова этой справки и отправки мне письма по e-mail.
DOS-like регулярные выражения
Маски в стиле DOS содержат только два масочных символа:
RegChar | Description |
* | Любая последовательность символов, допустимая в имени файла, в т.ч. и пустая строка |
? | Любой символ, допустимый в имени файла |
Для выделения фрагментов в подстроки используют символы < и >, например <*>.<*>.htm
для файла index.shtml.htm в подстроке <0> будет "index", в подстроке <1> будет "shtml".
Подстроки можно использовать для формирования новых имен файла. Для использования символов *, ?, <, > $ и \
как символов, а не как управляющих кодов, перед
ними нужно поставить символ \ (символ $ сейчас зарезервирован на будущее).
RegExp Регулярные выражения
Регулярные выражения (Regular Expressions, RE) - это строки определенного формата, предназначенные для управляния специальными алгоритмами обработки текстовой информации. Простейшие регулярные выражения - это wildcard символы ОС DOS '*' и '?': символ '*' при поиске файла означает любую последовательность символов, символ '?' - любой отдельный символ. Наиболее развитые по возможностям RE включены в язык Perl, используемый в UNIX системах (хотя есть замечательные реализации и под Windows). В программе Super Replacer синтаксис регулярных выражений близок к синтаксису языка Perl, а в чем-то даже улучшен.
При работе с RE следует помнить что любая последовательность символов, не являющаяся шаблонной, рассматривается как обычная.
Синтаксис регулярных выражений в Super Replacer:
RegChar | Description |
. | (точка) - любой символ |
/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 | символ пунктуации |
В некоторых случаях стандартных масок недостаточно. Тогда имеет смысл создать свою маску путем перечисления символов, которые должны входить (или не входить) в маску. Делается это следующим образом:
? | Один или ни одного символа. Программа сравнит очередной символ с маской, и если он соответствует маске, то символ засчитается, если же нет, то маска просто игнорируется и берется следующая маска. Например, строка 'x12' соответствует маске '/a?/u?12' |
+ | Один или более символов. Программа будет сравнивать символы из потока данных с этой маской до тех пор, пока не попадется первый несоответствующий символ. Но при этом хотя бы один символ должен соответстовать маске, иначе будет считаться что маска не соответствует входной строке данных. Так, '/d+' это любое десятичное число, а '/a+' - любое слово из латинских букв. |
* | Ни одного или более символов. Программа будет сравнивать символы из потока данных с этой маской до тех пор, пока не попадется первый несоответствующий символ. Но если первый же символ не будет соответствовать маске, программа просто пропустит маску и возьмет следующую. Например, RE 'X/d*X' соответствует строкам 'XX', 'X1X', 'X12345X' и т.д. |
Формирование строк по результатам разбора. Если строка и 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