На рисунке показан редактор web-страниц. Здесь вы можете изменять правила соответствия, которые позволяют Proxomitron'у перезаписывать web-страницы. Нажмите на интересующую вас область, чтобы получить объяснение её функции.


Основы...

Говоря просто, правила соответствия работают почти так же, как функция "Search and Replace" текстового процессора. Любой текст, соответствующий некоторому "выражению соответствия" будет заменен текстом в разделе "текст замены". Выражение соответствия "деньги" с текстом замены "много денег", например, заменит каждое появляющееся слово "деньги" на web-странице на "много денег". Просто, не правда ли?

Но самое интересное начинается тогда, когда вы начинаете смешивать правила.

"<start>" и "<end>"

Помимо нормального текста и выражений соответствия, окно для выражения соответствия может содержать два значения, которые имеют специальное значение: <start> и <end>

<start> вставляет текст замены в начало web-страницы - используйте это, чтобы добавить элементы вроде JavaScript к странице. Аналогично <end> может использоваться, чтобы вставить материал в конец страницы.

Для этих специальных случаев границы и пределы игнорируются. Также, когда используется многократные правила, элементы будут добавлены в том же самом порядке, в каком они находятся в списке фильтров web-страниц.

А что это за штука такая - Scope?

В HTML обычны тэги, расположенные на нескольких строках. Настройки Scope позволяют фильтру определить, насколько глубоко будет проведен поиск конца соответствия после обнаружения начала. Если не использовать Scope, то пришлось бы загрузить и просмотреть полную web-страницу, чтобы правило могло бы убедиться, что не было никакого соответствия. Не очень хорошая идея, поскольку никаких данных не посылалось бы броузеру, пока страница не загрузилась бы целиком. К счастью проектировщики HTML дали тэгам предсказуемое начало и окончание, которые делают поиск соответствия немного проще.

Byte limit (предел байтов) и bounds (границы) служат для ограничения количества просматриваемого текста.

Предел байтов задаёт, на сколько символов вперед будет просмотрен текст на соответствие выражению перед отказом от дальнейшего поиска. По возможности, делайте это значение как можно меньше - для большинства тэгов прекрасно подходит значение 128-256 или даже меньше . Увеличивайте его только если вы находите, что правило, которое должно работать, не делает этого. Задание этого значения слишком большим, однако, приведет к замедлению загрузки страниц, поскольку программа должна обработать большее количество данных перед посылкой их вашему броузеру.

Часто лучший размер сильно зависит от рассматриваемого тэга. Тэг "<script ... </script>", например, обычно нуждается в большем пределе, так как может содержать много строк JavaScript. В этом случае попробуйте предел около 4096.

Bounds Limit - только начальное выражение соответствия, обычно управляет диапазоном (или границами) главного выражения соответствия. Обычно проверка границ просто состоит из тэгов начала и конца HTML со звездочкой между ними - "<script * </script>" Всё, что допустимо для выражения соответствия может использоваться здесь, но в случае с проверкой границ - чем проще, тем лучше.

Использование Bounds Limit опционально - в нем нет необходимости для многих простых выражений соответствия. Однако в сложных случаях это может улучшить производительность, так как главное выражение будет проверяться, только если границы возвращают истину. Еще важнее, это также полезно для предотвращения соответствия правила большему количеству текста, чем ему предназначено. Возьмем следующее правило, которое должно соответствовать ссылке:

Соответствие: <a * href="slugcakes.html" > * </a>

Если применить его для следующего текста:

<a href = "crabcakes.html">некоторый материал</a>
<a href = "slugcakes.html">другой материал</a>

Первая звездочка соответствовала бы полной области, выделенной синим и захватывала бы обе ссылки вместо только второй! Использование границ подобно "< * </a >" ограничит проверку только одной ссылкой .

Выражение соответствия и границы

Если вы не используете границы, никогда не размещйте подстановочные знаки в начале или конце выражения соответствия (как в "*foo*"). Это закончится тем, что правило захватит столько символов, сколько установлено в byte limit, а это обычно не то, что вы хотите.

Однако если использовать границы, ситуация меняется. Так как границы выбирают диапазон просматриваемого текста - выражение соответствия должно соответствовать всему, что находится в пределах этих границ. Самый легкий способ добиться этого - использовать подстановочные знаки и в начале и в конце выражения. Часто используются переменные (как в "\1foo\2"), чтобы текст, окружающий часть тэга, которой должно соответствовать выражение, мог бы быть сохранен и включен в тексте замены.

Вот пример соответствия ссылке: <a href="http://somewhere"> некоторый текст </a>
Bounds: < a\s*</a >      Limit: 128
Соответствие: * href = "\1" * > *
Замена: <a href="\1"> некоторая новая ссылка </a>

Соответствие URL - различные виды управления поиском

Вы можете использовать "URL Match", чтобы ограничить работу фильтра определенными web-страницами, при этом вам достаточно сравнивать только часть URL. Для включения нескольких страниц можно использовать символ "ИЛИ" ("|"), например как в "www.this.com|www.this.too.com"; и отдельные страницы могут быть исключены, если использовать отрицание "(^ ...)", например "(^www.not.this.page)".

Также обратите внимание, что часть URL "http://" удалена - не используйте проверку на неё.
 

Если у вас множество URL для сравнения и вы хотите использовать одни и те же URL для различных фмльтров, воспользуйтесь блок-файлами. Например, если вы имеете блок-файл "MyURLs" и хотите. чтобы фильтр работал на сайтах из этого списка, просто втавьте $LST(MyURLs) в поле соответствия URL. Аналогично, если вы хотите чтобы фильтр работал на всех сайтах не входящих в список, просто используйте отрицание: (^$LST(MyURLs)). Фактически, если вы кликнете правой кнопкой в поле соответствия URL, то найдете команду для автоматического добавления блок-файла или его редактирования.

Что делает "Allow for multiple matches"?

Обычно, когда правило отработало, результат посылается непосредственно web-броузеру - никаким другим правилам не позволено его более обрабатывать. Это сделано главным образом для эффективности, поскольку сохраняет весьма немного работы, но зато является полезным способом задать приоритет одних фильтров над другими.

Однако это не всегда работает. Возьмите тэг "<Body ... >" - он содержит несколько несвязанных элементов, которые мы можем захотеть изменить. Например, если мы имеем два правила - изменяющее заданный по умолчанию цвет текста и изменяющее фоновое изображение - мы будем иметь проблемы. Первое правило помешало бы работе второго правила, "исчерпывая" <Body> тэг. В этом случае удобно использовать опцию "allow for multiple matches". Когда она задействована, то правило вставляет результат своей работы назад в буфер обработки, так что другие правила могут получить свою долю. В вышеупомянутом сценарии, если мы разрешим это в первом правиле, то второе правило тогда также может найти соответствие.

Используйте эту возможность аккуратно - она очень мощна и, соответственно, требует больших вычислительных ресурсов, чем обычно. А неосторожное ее использование может привести к "рекурсивному" соответствию.

Представим следующую ситуацию - скажем, есть правило с полем соответствия "лягушка" и текстом замены "Злая лягушка должна умереть!". Выглядит достаточно невинно, не правда ли? Ах, но если бы для этого правила было бы разрешено многократное соответствие, "лягушка" в тексте замены вызвала бы ситуацию, когда правило соответствовало бы его собственным результатам, что закончилось бы бесконечной чумой лягушек! Почему? Хорошо, в первый раз, когда правило "видит" слово "лягушка", оно вставляет фразу "Злая лягушка должна умереть!" - достаточно просто, но просмотр продолжается дальше, пока правило не находит новую "лягушку" и процесс повторяется снова. Решение? Хорошо, если бы слово "лягушка" было первым словом в тексте замены, этого не случилось бы. Следующее соответствие всегда производится через одну букву вперед, так что правило увидело бы "ягушка" вместо "лягушка". Из всего вышесказанного запомните только одно: удостоверьтесь, что ваше правило не будет соответствовать его собственному тексту замены минус первый символ - и все будет хорошо.