1

是否可以在 Procmail 中创建正则表达式来过滤掉包含某些单词的链接?

例如,我想过滤所有包含超链接的电子邮件,其中包含“取消订阅”一词(尽管它可能不是唯一的词)。这将过滤掉在子文件夹中发送给我的大量时事通讯,我可以不时查看。

例如,我试试这个:

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

但这只会过滤掉带有链接的任何内容,其中包含一些带有取消订阅的单词(不一定在链接中),然后是另一个关闭链接(不一定是单词之后的第一个)。它不会过滤单词 unsubscribe 之前的最后一个打开的超链接,直接跟在第一个关闭超链接标记之后。

我找不到任何信息如何在单词之前找到一些 HTML 的最后一次出现,然后是单词,然后是单词之后第一次出现的一些 HTML,我想这是我需要做的。

4

1 回答 1

1

这并不完全准确,但可能与您想要的足够接近。

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

这会查找一个 HTMLa元素,其属性包含在正文文本 (标志 )href中的双引号中。可选组允许在.unsubscribeB([ ]+[^ > ]+)*href

按照 Procmail 的惯例,内部[ ]和内部的空格[^ > ]应该是空格和制表符,顺序不限。(我现在使用的移动设备不允许我轻松输入标签,所以这不是复制/粘贴证明。)

然而,并不是所有的 HTML 都是格式正确的,不是所有href的属性都是双引号,也不是所有的 HTML 附件都是未经编码的。事实上,最大的实际缺陷是没有正确处理引用打印的 HTML。一个简单的“80/20”解决方案是更改==(3D)?; 一个非常复杂的问题是如何处理所有可能的 QP 变化(包括可选的等号,任何地方的换行符);真正正确的解决方案是使用适当的 MIME 感知工具,而不是使用 Procmail,或者从 Procmail 内部使用;这样,您还可以透明地处理 base64 编码的 HTML。

从表面上看,您的直接问题是通过将重复运算符从贪婪更改为非贪婪来回答的。用这么多的话来说,.*将跳过尽可能多的文本,而[^>]*永远不会在下一次出现之前跳过>。但是,如上所述,由于 MIME 允许以不同方式对文本进行编码以便通过电子邮件安全传输,因此存在显着的额外复杂性。

于 2013-09-28T10:15:46.007 回答