Нужен фильтр на основе PCRE для Privoxy

Аватар пользователя DRVTiny

Задача, требующая оперативного решения: нужно с помощью стандартных регулярных выражений Perl написать фильтр вида s||| , который будет удалять все теги , которые подгружают изображения с посторонних сайтов (т.е. значение параметра SRC представляет абсолютный адрес, доменная часть которого не совпадает с доменной частью адреса загружаемой веб-страницы). На данный момент всё, на что хватило моих собственных способностей выглядит как s|||sigU Не густо, правда? (этот с позволения сказать фильтр вообще все тэги убивает. Хотя для некоторых страниц и такой вот радикальный подход является вполне оправданным)

Так что если у кого есть идея получше, предлагайте!

Аватар пользователя slavaz

Re: нужен фильтр на основе PCRE для Privoxy

$replace_img="/img/fuck_images.jpg";
while (<>){
$_ =~ s/(<[Ii][Mm][Gg])([^"]*(?=[Ss][Rr][Cc]))([Ss][Rr][Cc]=['"])([Hh][Tt][Tt][Pp]|[Ff][Tt][Pp]):\\/\\/[^'"]*([^\>]*(?=\>))/$1 $2 $3${replace_img}$5/g;
    print $_;
}

Аватар пользователя DRVTiny

Re: нужен фильтр на основе PCRE для Privoxy

Работает!!! (проверено на main page referats.ru)

Аватар пользователя slavaz

Re: нужен фильтр на основе PCRE для Privoxy

Еще раз посмотри, я исправил регулярку. Сбоила, если на одной строке было два и более

Аватар пользователя DRVTiny

Re: нужен фильтр на основе PCRE для Privoxy

Хотя вообще-то эта абракадабра делает всё же что-то не совсем то, что мне надо: а где здесь проверка на соответствие доменного адреса (уже на lycos.com изображения не фильтруются)?

Аватар пользователя slavaz

Re: нужен фильтр на основе PCRE для Privoxy

Эта абракадабра ищет все или
То есть, если в src указывается интернет-адрес, а не относительный, то картинка режется.
Если надо оставить возможность указывать в виде интернет-адреса адрес некоего хоста (свой же, например), то регуляркой в одну строку тут не получится. Как минимум нужна будет вторая регулярка с проверкой домена.

Аватар пользователя slavaz

Re: нужен фильтр на основе PCRE для Privoxy

Еще немного кода. Правда, регулярке уже надо два параметра.

$replace_img="http://192.168.192.168/img/fuck_images.jpg";
$my_domain="my.domain.net";
while (<>){
    $_ =~ s/(<img>]*(?=>))/$1$2 src=$3${replace_img}$6$7/xsgmi;
    print $_;
}

Попробуй это.
$my_domain - имя домена, с которого надо оставлять картинки. Надеюсь, privoxy будет передавать текущий домен (домен страницы) к регулярке.

Аватар пользователя DRVTiny

Re: нужен фильтр на основе PCRE для Privoxy

А что обозначает вот эта конструкция: ([^"]*(?=src)); "(?=src)" - это, наверное, что-то типа условного оператора внутри регэкспа, а остальное к чему относится?
Как я понимаю (а понимаю я скорее всего неправильно),
$1=(]*(?=>))

Вообще, если не затруднит, посмотри в прилагаемый к сообщению default.filter - там по идее должно быть несколько примеров того, как можно получить имя текущего домена в регэкспе. Всё дело в том, что я, к стыду своему, в этом наборе иероглифов совершенно не ориентируюсь и могу подолгу зачарованно-тупо смотреть на рунические письмена фильтров Privoxy, аки баран на новые ворота, но понимания у меня от этого не прибавится ни на йоту... (надо бы мне в ближайшее время справочник по регулярным выражениям изд.-ва O'Reily купить) А вот ты, как достойный ученик великого Аль-Хорезми Улыбка, с высокой долей вероятности, сможешь сделать ценные практические умозаключения по итогам брифинг-осмотра некоторых фильтров Privoxy, за что я был бы тебе очень и очень признателен.

ВложениеРазмер
filters.zip 9.32 КБ
Аватар пользователя slavaz

Re: нужен фильтр на основе PCRE для Privoxy

Цитата:
А что обозначает вот эта конструкция: ([^"]*(?=src))

Выбрать всё, кроме двойных кавычек, концом области действия служит 'src'
Немного неправильно, потому что спотыкнётся на

Цитата:
Вообще, если не затруднит, посмотри в прилагаемый к сообщению default.filter - там по идее должно быть несколько примеров того, как можно получить имя текущего домена в регэкспе.

К сожалению, там нет такого примера. Всё основано на статическом изменении страниц.

Цитата:
А вот ты, как достойный ученик великого Аль-Хорезми

Мнэ-э-э... кого? Улыбка
Я ученик манов, ховтушек и гугля. А что это за террорист Аль-Хорезми - я не знаю (к стыду или счастью - ещё не определился) Улыбка

Аватар пользователя DRVTiny

Re: нужен фильтр на основе PCRE для Privoxy

Цитата:
Выбрать всё, кроме двойных кавычек, концом области действия служит 'src'

А нельзя ли как-нибудь предварительно удалить все парные кавычки вместе с их содержимым, сделав исключение для тех из них, внутри которых первым словом идёт http://|ftp:// ?

Цитата:
Я ученик манов, ховтушек и гугля. А что это за террорист Аль-Хорезми - я не знаю (к стыду или счастью - ещё не определился) Улыбка

Незнание первоисточников не избавляет от огромной моральной ответственности за будущее человечества, процветание широких масс трудящихся и за созидание прочих форм обеспечения всеобщего благоденствия.
В общем, тебе слово "алгоритм" не напоминает ли о чём-нибудь?

Аватар пользователя slavaz

Re: нужен фильтр на основе PCRE для Privoxy

Цитата:
А нельзя ли как-нибудь предварительно удалить все парные кавычки вместе с их содержимым, сделав исключение для тех из них, внутри которых первым словом идёт http://|ftp://

То есть строку, например

преобразовать к виду

Я правильно понял?

Аватар пользователя DRVTiny

Re: нужен фильтр на основе PCRE для Privoxy

Нет, ну ведь не предполагается же эту строку в таком виде на выход посылать. Я имею в виду - нельзя ли создать временную переменную, в которой будет хранится входная строка без содержимого всех двойных кавычек (и самих кавычек), за искл. тех, которые находятся внутри конструкции src \s* = \s* " \s* http://|ftp://....

Аватар пользователя slavaz

Re: нужен фильтр на основе PCRE для Privoxy

Цитата:
Я имею в виду - нельзя ли создать временную переменную, в которой будет хранится входная строка без содержимого всех двойных кавычек

К сожалению, я не знаю всех возможностей privoxy, чтобы ответить на вопрос. То есть если privoxy позволяет создавать переменные, тогда я в эти переменные запихну всё, что душа пожелает.

RSS-материал