Язык сравнения текста - ключ к пониманию работы фильтров Proxomitron'a. Он позволит вам сравнивать сложные комбинации HTML-тэгов и сохранять части сравниваемого текста в переменных, которые могут позже использоваться в тексте замены.

Если вы знакомы с подстановочными символами DOS или UNIX вида (*?, [...]) или регулярными выражениями, то вы найдете много общего с правилами сравнения текста Proxomitron'a. Моя первоначальная цель, фактически, состояла в том, чтобы создать язык сравнения текста столь же удобный, как подстановочные символы DOS или UNIX и обладающий мощью регулярных выражений. Не уверен точно, преуспел ли я в этом, но так или иначе, все это работает! ;-)

Если этот материал плохо знаком вам, ознакомьтесь предварительно с основами языка сравнения текста

Многие правила были разработаны таким образом, чтобы сделать работу с HTML легче. Например, так как регистр редко имеет значение в HTML, все сравнения нечувствительны к регистру, что исключает неприятности при испытании на прописные и строчные буквы.

Мета-символы Proxomitron'a

Далее полный список всех мета-символов Proxomitron'a и описание их назначения.

* Звездочка будет соответствовать любой строке символов. Например, "foo*bar" будет соответствовть "foobar", "fooma babar", или даже "foo goat bat bison bar". В основном, звездочка значит "искать вперед на соответствие чему-нибудь, пока вы не найдете то, что следует за звездочкой"

? Знак вопроса соответствует любому отдельному символу, независимо от его природы. "?oat" будет соответствовть "boat" or "goat" или даже "<oat".

[abc...] Квадратные скобки соответствуют любому отдельному символу, перечисленному в пределах '[' и ']'. Также могут быть проверены диапазоны, если использовать знак минус: "[A-Z]" будет соответствовать любой букве от "A" до "Z", в то время как "[0-9]" будет соответствовать любой отдельной цифре. Если первый символ - "^", то это выражение будет соответствовать любому символу, не входящему в скобки - "[^0-9abc]" будет соответствовать любому символу, если это - не цифра и не "a", "b", или "c".

[#n-n] Специальное числовое соответствие. Используется для легкого определения значений числового диапазона в HTML-тэгах. Например, чтобы определить число между 100 и 150 используйте "[#100-150]". Если второй номер(число) - '*', то это действует, как бесконечно большое, "[#40-*]" будет соответствовать любому числу, большему 40. Проверить число меньше 40 можно просто используя "[#0-40]". Чтобы определить точное число, второе число может быть опущен (например "[#100]"). Числовое соответствие будет истинным независимо от нулей в начале или кавычек, окружающих число - tag="0100". Обратите внимание, что в настоящее время это правило работает только с положительными числами, но вы можете использовать черточку, чтобы проверить на отрицательные значения: "-[#2-7]" например, может использоваться для проверки соответствия от -2 до -7.

" " Пробел всегда соответствует - но также поглощает любое число пробелов или табуляторов, сколько найдет. Используйте это там, где может или не может быть пробел между элементами. Например, "<tag value>" будет соответствовать "<tag value>" или "<tag value>" или даже "<tagvalue>".

\s Подобно пробелу, поглощает любое число пробелов или табуляций, но для соответствия должен наличествовать по крайней мере один. Например " <tag\s> " будет соответствовать "<tag >" или "<tag >", но не "<tag>".

\w Соответствие слову. Будет соответствовать любому числу непробельных символов. В основном, это противоположность "\s", но в некоторых случаях также подобно "*". Различие в том, что поиск прекращается по достижении пробела или ">" (который отмечает конец HTML-тэга). Это становится очень удобным при сравнении значений тэгов и URL (см. советы и уловки)

\t Явно соответствует символу табуляции

\r Явно соответствует символу перевода каретки (вводу)

\n Явно соответствует символу "новая строка"

\0-9 Соответствует переменной. Это одно из ключевых понятий правил сравнения Proxomitron'a. Действует точно так же, как символ "*", но сохраняет то, что совпало, в одну из десяти переменных. Эти переменные могут использоваться в тексте замены, чтобы включить части первоначального HTML. Используется для того, чтобы изменить только часть тэга и оставить другие части нетронутыми. Например, чтобы изменить только фон в тэге <body ...>, вы можете использовать...

Соответствие: <body \1 background="*" \2 >
Замена: <body \1 background="mybackground.gif" \2 >

В этом случае все, что было первоначально в пределах тэга до и после тэга background, будет включено в текст замены.

Более сложные сравнения могут быть получены, если поместить переменную непосредственно после набора круглой скобки без пробела, например "(foo*bar)\1". В этом случае, всё в пределах круглых скобок будет помещено в переменную. Это подобно регулярным выражениям, но с дополнительной возможностью выбрать, какая переменная будет использована.

| Вертикальная черта используется как функция "ИЛИ". Например "foo|bar" будет соответствовать "foo" или "bar".

& Используется как функция "И". Например "*foo&*bar" будет соответствовать "foo bar" или "bar foo", но не "foo foo". Обратите внимание на использование звездочки - что-нибудь подобное необходимо всегда использовать с функцией "И", так как слово могло бы никогда не быть обоими и " foo" и "bar" в том же самом месте и времени ;). Функция "И" полезна для ситуаций, где значения тэга могут находиться в любой последовательности...

<img src="picture" height=60 width=200>
можно также записать:
<img width=200 height=60 src="picture">
и оба будут соответствовать:
<img (*src="picture" & *height=60 & *width=200)*>

&& Используется как функция "И-И", работает аналогично одиночному "&" с одним небольшим (но важным) различием - вторая часть И ограничена соответствием точно тому, что сделала первая часть. Непонятно? На самом деле все очень просто. Допустим, мы имеем выражение:

(<img * > && \1 ) ... теперь "\1" действует подобно "*" и данная обычная И должна совпасть с начала "<img " до конца доступного текста (и конец тега изображения). И-И ограничивает соответствие только содержимому тега <img ... > и больше ничему (так как \1 созранит только тег <img ...>). Вы можете использовать это подобно границам для ограничения диапазона просмотра и предотвращает излишний "выбег" выражений.

(...) Круглые скобки используются для создания соответствия подвыражениям в пределах соответствия фразам. Например "foo (bar|bear|goat)" будет соответствовать "foobar", "foobear" или даже "foogoat". Круглая скобка может быть вложена, например "foo(bar | (black|brown|puce) bear|goat)" будет соответствовать "foobar" "fooblackbear" "foobrownbear" и т.д. Как и в случае с "[...]", если первый символ после "(" - "^", то выражение будет соответствовать, только если выражение не соответствует содержимому скобок. Например, "(^foo|bar)" будет соответствовать чему-нибудь, если это - не "foo" или "bar". Обратите внимание, что инвертированное выражение не поглощает никаких символов - оно только проверяет их. Я думаю, Perl называет это "negative forward assertion"?

+ Знак "плюс" указывает на наличие повторяющихся символов. Например, "а+" будет соответствовать "a", "aa", или "aaaa". Вы можете использовать это после других мета-символов или круглых скобок для более сложных соответствий. Например:

[abc]+            будет соответствовать последовательности любых символов "a","b" или "c", например "ababccba"
([a-z]&[^n])+ будет соответствовать последовательности символов от "a" до "z", исключая "n"
(foo)+        будет соответствовать "foo", "foofoo", "foofoofoo", и т.д.

Важно понимать, что "+" действует "вслепую". Это значит, что он будет повторять соответствие до тех пор, пока тестируемое условие соответствует истине, невзирая ни на что, следующее за ним! Например, "(foo)+foobar" никогда не найдет совпадения. Почему? Повтор будет поглощать все "foo" и не оставит "foo" для "foobar"! Иногда это может быть очень полезным, но если это не то, что вы хотите, попробуйте "++".

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

\ Может использоваться для "отмены" любого специального символа и обрабатывать его как нормальный символ. Например, для соответствия круглой скобке в тексте HTML используйте " \(", а для соответствия наклонной черте используйте "\\".

= Символ равенства имеет специальное значение. Он будет соответствовать не только непосредственно "=", но также и любому пробелу до или после, что упрощает испытания на значения тэгов. Например foo="bar" также соответствует foo= "bar" или foo = "bar"

" Двойные кавычки - будут соответствовать как двойным, так и одинарным кавычкам (так как любые могут использоваться в HTML). Например " * " будет соответствовать:

"oh happy mongoose" ...or... 'oh happy mengeese'

Если же вы хотите явно проверить на двойные кавычки, просто используйте \"

' Одиночные кавычки "умнее" обычных: Они пытаются соответствовать соответствующей оконечной кавычке для любой кавычки, предварительно согласованной двойной кавычкой - даже если есть другие кавычки между ними! Запутались? Ничего - в HTML обычно использование смеси одиночных и двойных кавычек, и когда вы нуждаетесь в "кавычках в пределах кавычек" - смотрите на следующие примеры:

одиночные внутри двойных: href=" javascript:window.open( ' bison.html ' ); " или

двойные внутри одиночных:
href=' javascript:window.open( " bison.html " ); '

Оба случая могут быть согласованы href = (" * ') - просто используйте двойные кавычки для соответствия начальной кавычке и одиночные кавычки для соответствия оконечной кавычке. Здесь есть некоторые ограничения: начальные и оконечные кавычки должны быть в том же самом подвыражении - то есть в одной и той же вложенной круглой скобке. Например:

" some text ' Работает
( " some text ' ) Также работает
" ( some text | other text) '     Даже так работает… но
" ( some text ' ) Не работает так
( " | ) some text ( ' | ) Печально, но так тоже не будет работать

Другое ограничение - начальные и оконечные кавычки не могут быть вложены в одном и том же подвыражении:

"кое-что" кое-что еще 'конец кое-чего' не будет работать

Однако, вы можете вкладывать их, используя различные подвыражения, например:

"кое-что (" кое-что еще ') конец кое-чего '

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


Специальные коды замещающего текста

Помимо правил сравнения, есть несколько специальных кодов, которые используются в замещающем тексте.

Во первых, "\0" - "\9" используются для вставки значений, сохраненных в соответствующих переменных от соответствующих выражений. Для данных, сохраненных переменной \# вы можете использовать "\@", которая сбрасывает все содержимое переменной, или \#, чтобы извлечь следующий элемент (если, например, вы сохранили три элемента, то \#\#\# должна вывести их все через пробел). Есть также несколько других:

\k - Уничтожает текущее подключение. Может быть полезно для использования в фильтрах заголовков HTTP, для блокировки загрузки определенных URL и в фильтрах web-страниц, чтобы пропустить загрузку оставшейся части страницы.

\u - Вставляет полный URL данной страницы

\h - Вставляет часть URL, соответствующую хосту

\p - Вставляет часть URL, соответствующую пути

\q - Вставляет любую запрошенную строку из URL (что-нибудь следующее за "?")

\a - Вставляет любой текст ссылок из URL (что-нибудь следующее за "#")

\d - Вставляет каталог Proxomitron в "file://" (помогает включать изображения или данные для замены)

\x - Вставляет префикс URL-команд, если задан (Будьте осторожны с этим! Не стоит давать свой префикс серверу!)

Примечание: \h \p \q \a и \u могут быть использованы и в выражениях. \h, в частности, может иногда быть полезной, чтобы узнать, имеет ли URL на странице то же имя хоста, что и сама страница (или он ведет на другой сервер).

Команды Proxomitron (расширенные функции)

Помимо нормальных мета-символов, Proxomitron также сейчас имеет специальные команды. Они расширяют нормальные правила соответствия и добавляют различные виды полезных функций. Все они начинаются с "$", пишутся в верхнем регистре и с последующими скобками "(...)", содержащими параметры команды. Например, команда $LST(...) используется для проверки списка из любого выражения:

<img * src="$LST(ImageURLCheck)" * >

Может использоваться для проверки, что URL тега "image" совпадает с чем-либо в списке "ImageURLCheck". Доступно намного больше подобных команд, которые могут использоваться для упрощения создания фильтров. Пример вверху используется в выражении соответствия, другие могут использоваться в тексте замены, а некоторые в них обоих. Подробнее см. команды Proxomitron. Это все правила. Дополнительные примеры по их использованию смотрите в разделе советы и уловки.