Создание фильтров контентаВсе шаблоны фильтров Privoxy имеют следующее строение:
Code:s/Поиск/Замена/Модификаторы
Модификаторы определяют режим поиска:
g — поиск и замена производится до тех пор, пока условие соблюдается.
i — производится регистронезависимый поиск/замена
s — производится многострочный поиск/замена
Рассмотрим простой вариант, к примеру, нам нужно удалить следующий фрагмент: Code:<a href="http://site.com/promo/2421.htm"><img src="/img/2421.jpg" /></a>
Шаблон будет выглядеть следующим образом:
Code:s@<a\s+[^>]*site\.com/promo/[^>]*.*</a>@@sig
где:
«<
a\s+» - начало тега «а» с гарантированным пробелом
«[^>]*» - любое количество символов за исключением границы открывающего тега «a»
«
site\.com/promo/» - ключевой фрагмент адреса
«
.*</a>» - любое количество символов до закрывающего тега «a»
Отсутствие символов в замене говорит о том, что найденный шаблон будет удаляться полностью.
Модификаторы «
sig» показывают, что поиск должен продолжаться много раз, быть многострочным и регистронезависимым.
Рассмотрим вариант немного сложнее — нам нужно удалить рисунок, но оставить ссылку с описанием из alt тега. Code:<a href="http://site.com/promo/2421.htm" alt="Promo links"><img src="/img/2421.jpg" /></a>
Code:s@(<a\s+[^>]*site\.com/promo/[^>]*alt="([^"]*)[^>]*>).*(</a>)@$1Blocked: $2$3@sig
где:
в переменную
$1 заносится весь открывающий тег «
<a ...>»
в переменную
$2 заносится содержимое тега «
alt="..."»
в переменную
$3 заносится закрывающий тег «
</a>»
После все эти переменные используются в замене, вначале открывающий тег «
<a ...>», затем текст, содержащийся в теге «
alt="..."», а затем и закрывающий тег «
</a>».
В итоге из графической ссылки мы получили обычную текстовую.
Самый сложный вариант — когда нам надо удалить из контента javascript с определенным ключевым словом. Сложность состоит в том, что при обычной фильтрации может случиться так, что будет удалено все от открывающего тега первого скрипта до закрывающего тега последнего.
Решается все на редкость просто:
1.Помечается закрывающий тег каждого скрипта специальным символом.
2.Производится фильтрация, ограничением которой служит как раз этот специальный символ.
3.Удаляется из закрывающих тегов скриптов все специальные символы.
Фильтр будет состоять из трех шаблонов, функционал каждого из них описан выше:
Code:s@</(script)@\e</$1@sig
s@<script[^\e]*?banner[^\e]*?\e</\script>@<!-- Blocked ad-script -->@sig
s@\e</(script)@</$1@sig
где «
[^\e]*?» как раз и определяет любое количество символов до появления символа ограничения «
\e» - обозначающего начало закрывающего тега.