是否可以在Procmail中创建正则表达式来过滤掉包含某些单词的链接?
例如,我想过滤掉所有带有“unsubscribe”字样的超链接的电子邮件(虽然它可能不是唯一的字)。这会过滤掉我在一个子文件夹中发送给我的很多新闻通讯,我可以立即检查。
例如,我试试这个:
.*<a.*unsubscribe.*</a>.*
但是,这只会过滤掉任何带有链接的内容,其中包含一些取消订阅的单词(不一定在链接中),然后是另一个结束链接(不一定是单词之后的第一个)。它不会在单词unsubscribe之前过滤最后打开的超链接,直接后跟第一个结束超链接标记。
我找不到任何有关如何在单词之前找到某些HTML的最后一次出现的信息,然后是单词,然后是单词之后的第一次出现的HTML,我想这就是我需要做的。
答案 0 :(得分:1)
这不完全准确,但可能足够接近你想要的东西。
:0B
* <a([ ]+[^ > ]+)*[ ]+href="[^>"]*unsubscribe
unsub/
这会在正文(a
标志)中查找包含href
的双引号中带有unsubscribe
属性的HTML B
元素。可选组([ ]+[^ > ]+)*
在href
之前允许零个或多个其他属性。
与Procmail中的常规内容一样,[ ]
和[^ > ]
中的空格应该是任何顺序的空格和制表符。 (我现在使用的移动设备不会让我轻松输入标签,因此不能复制/粘贴。)
但是,并非所有HTML都格式正确,并非所有href
属性都是双引号,并且并非所有HTML附件都是未编码的。实际上,最大的实际缺陷是引用可打印的HTML无法正确处理。一个简单的“80/20”解决方案是将=
更改为=(3D)?
;一个非常复杂的问题是如何处理所有可能的QP变化(包括可选的equals,newline wrap wrap);真正正确的解决方案是使用一个正确的MIME感知工具来代替或从内部使用Procmail;这样,您还可以透明地处理base64编码的HTML。
从表面上看,通过将重复操作符从贪婪更改为非贪婪来回答您的直接问题。在很多单词中,.*
会跳过尽可能多的文本,而[^>]*
将永远不会在下一次出现>
之前跳过。但是,如上所述,由于MIME允许以不同方式对文本进行编码以便通过电子邮件进行安全传输,因此存在明显的其他复杂情况。