2013-09-28 3 views
1

Возможно ли создать регулярное выражение в Procmail, чтобы отфильтровать ссылку, содержащую определенные слова?Как фильтровать сообщения в Procmail, которые имеют определенные слова в гиперссылках

Например, я хотел бы отфильтровать все письма, содержащие гиперссылку со словом «отписаться» (это может быть не единственное слово). Это отфильтровало бы множество информационных бюллетеней, отправленных мне в подпапку, которую я могу проверять снова и снова.

Например, я стараюсь это:

.*<a.*unsubscribe.*</a>.* 

Но что бы просто отфильтровать ничего со ссылкой, с некоторыми словами с отписки в нем (не обязательно в ссылке), то другую ссылку закрытия (не обязательно первый после слова). Он не будет фильтровать последнюю открытую гиперссылку до того, как слово отпишет подписку, за которым следует первый закрывающий тег гиперссылки.

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

ответ

1

Это не совсем точный, но, вероятно, достаточно близкий к тому, что вы хотите.

:0B 
* <a([ ]+[^ > ]+)*[ ]+href="[^>"]*unsubscribe 
unsub/ 

Это выглядит для HTML a элемента с href атрибута в двойных кавычках, содержащих unsubscribe в тексте (B флаг). Необязательная группа ([ ]+[^ > ]+)* допускает ноль или несколько других атрибутов до href.

Как обычно в Procmail, пробел внутри [ ] и в [^ > ] должен быть пространством и вкладкой в ​​любом порядке. (Мобильное устройство, которое я использую сейчас, не позволит мне легко вводить вкладку, поэтому это не копирование/вставка.)

Однако, не все HTML хорошо сформированы, не все атрибуты href являются двойными, цитируется, и не все вложения HTML отправляются без права доступа. Фактически, самым большим практическим недостатком является то, что котируемый HTML-код не обрабатывается правильно. Простое решение «80/20» должно было бы изменить = на =(3D)?; чрезвычайно сложная проблема заключается в том, как обрабатывать все возможные варианты QP (включая необязательные равные, перенос новой строки в любом месте); действительно правильным решением было бы использовать надлежащий MIME-инструмент, а не, или изнутри Procmail; таким образом, вы также можете обработать base64-encoded HTML прозрачно.

На первый взгляд, на ваш непосредственный вопрос отвечает изменение операторов повторения от жадных до неживых. Во многих словах .* пропустит как можно больше текста, тогда как [^>]* никогда не пропустит перед самым очередным вхождением >. Однако, как отмечено выше, существуют значительные дополнительные осложнения из-за того, как MIME позволяет кодировать текст по-разному для безопасной передачи по электронной почте.

+0

Отлично, спасибо большое, у меня будет игра и вернусь к вам. Я никогда не думал, что я буду фильтровать все письма, которые должны совпадать, но если он фильтрует большинство, это достаточно хорошо! –