Feed Filter Maker 过滤规则为什么没按预期生效?

Feed Filter Maker 的过滤规则不生效,通常不是网站坏了,而是规则被当成正则表达式处理了。每个包含/排除输入框里的多个值会用 | 拼成一个正则表达式,只要其中任意一段能匹配条目文本,该条就被判定命中。所以关键词里出现正则特殊字符、包含与排除同时命中、大小写设置不一致、或匹配到了条目正文里的无关文字,都会让结果和预期不同。

规则是怎么被拼起来的

根据页面说明,每个过滤器(包含和排除各算一个)的文本框内容会被合并成单个正则表达式,各值之间用 | 分隔。

例如包含框里写:

[720p] [English]

实际等价于:

720p|English

也就是说,[720p] 和 [English] 并不是“同时满足 720p 和 English”,而是“满足 720p 或 English”。这是最常见的误解来源。

由此带来的几个坑

  • 方括号不是分组,是字符集。 在正则里 [720p] 表示“匹配 7、2、0、p 中的任意一个字符”。如果你想要字面量方括号,需要转义成 \[720p\]。
  • 多个词是“或”不是“与”。 想让条目同时包含两个词,得自己写正则,比如 (?=.*720p)(?=.*English),而不是简单并列。
  • 特殊字符要转义。 . * + ? ( ) [ ] { } ^ $ | \ 在正则里有特殊含义。想匹配字面量,前面加 \。
  • 空格会被保留。 写 720p English(中间空格)会当成“匹配 720p English 这个连续字符串”,而不是两个词。

包含和排除同时命中时会怎样

页面没有给出包含与排除冲突时的优先级说明,因此不要依赖“排除一定赢”或“包含一定赢”的假设。稳妥做法是让两组规则互不重叠:

  • 包含框只放你确实想要的特征。
  • 排除框只放你明确不想要的特征。
  • 避免同一个词既出现在包含里又出现在排除里。

如果发现某条该被排除却仍出现,先检查它是否被包含规则命中、以及排除词是否因正则语法没写对而失效。

大小写设置的影响

页面提供 Ignore Case(忽略大小写)和 Don't Ignore Case(区分大小写)两个选项,并说明“大多数情况下你会想忽略大小写,但可以选择不忽略”。

  • 选 Ignore Case:English 能匹配 english、ENGLISH。
  • 选 Don't Ignore Case:只匹配大小写完全一致的形式。

如果规则看起来“有时生效有时不生效”,先确认这个开关的状态是否和你的关键词大小写一致。

匹配的是条目全部文本

页面明确说明:每个条目的所有文本都会被搜索。这意味着关键词可能命中标题之外的内容,比如正文、作者、摘要、链接文字等。

典型表现:

  • 你只想按标题过滤,但某个词出现在正文里,条目也被保留或排除。
  • 排除词恰好是常见词(如 the、news),会误伤大量条目。

想减少误匹配,尽量用足够具体的词或正则,而不是宽泛的短词。

排查清单

按顺序检查,基本能定位问题:

  1. 看拼接结果:把包含/排除框里的内容按 | 连起来,想象它作为正则去匹配条目文本。
  2. 转义特殊字符:方括号、点号、加号等想按字面匹配就加 \。
  3. 确认“或/与”:并列多个词默认是“或”;要“与”得写前瞻正则。
  4. 统一大小写设置:关键词大小写和 Ignore Case 选项保持一致。
  5. 缩小匹配范围:避免用会出现在正文里的常见词。
  6. 用 Test 验证:页面提供 Test 按钮,改完规则先测试再复制过滤后的订阅源地址。

验证规则是否生效

页面给出的流程是:

  1. 填写源订阅地址(source feed url)。
  2. 设置包含/排除关键词与大小写选项。
  3. 点击 Test 查看过滤结果。
  4. 确认无误后,复制 filtered feed url,粘贴到你的阅读器。

如果 Test 结果符合预期、但阅读器里不对,问题多半在阅读器缓存或你复制的地址不是最新的过滤源地址,重新复制一次即可。

保存与备份的注意点

  • 给订阅源起名字后会自动保存到浏览器,下次回来可在下拉框里找到。
  • Export OPML 用来备份浏览器里的订阅源。
  • Import OPML 会把 OPML 里的源与浏览器里的合并;同名源会被 OPML 文件里的版本替换。

所以导入前先导出备份,避免同名规则被覆盖后无法找回。

feed.janicek.co