结论先给:只有当你能用一批“预期不该被替换”的反例样本,证明替换规则不会误伤时,批量替换才值得执行。反例样本的作用不是验证替换成功,而是验证替换失败。如果反例样本全部通过,但正例样本中有一例被漏替,说明规则过于保守;如果反例样本出现误替,说明规则过于激进,此时应缩小匹配范围或增加排除条件,而不是继续扩大替换。
构造反例样本前,先列出替换规则可能误伤的对象。常见的四类:
每一类至少准备两条样本,一条明显属于该类,一条处于边界。样本应来自你实际要处理的页面或字段,而不是临时编造。假设你准备把正文中的“旧型号”统一替换为“新型号”,那么反例样本里应包含“旧型号Pro”这种带后缀的词,以及出现在 <a href="...">旧型号</a> 锚文本中的情况。
多个角色对同一事实理解不同时,分歧往往不在“要不要替换”,而在“哪些算目标文本”。把分歧转成可核对的项目,需要每个反例样本附带三样东西:
把这三列放进同一份清单,让每个角色对“预期结果”单独确认。如果两个人对同一样本给出不同预期,这个样本就是需要优先解决的分歧点。解决方式不是投票,而是回到页面用途:该位置是给读者看的正文,还是给机器读的属性值。用途决定它是否属于替换范围。
反例样本只能证明“不该动的没被动”,不能证明“该动的都动了”。构造反例样本时,必须同时保留一组正例样本,即明确应该被替换的文本。执行替换后,检查两件事:反例样本是否原样保留,正例样本是否全部更新。只有两组同时通过,才进入下一步。
这里有一个容易失效的条件:如果替换规则依赖精确匹配,而页面中存在大量同义但不同写法的表达,反例样本通过只说明规则没有误伤,不说明覆盖完整。此时应把“未覆盖的同义写法”补充为正例样本,而不是直接扩大替换范围。扩大范围会让原本通过的反例样本重新面临误伤风险。
另一个使结论失效的反例是:反例样本本身选错了位置。例如你从已发布的静态页面复制样本,但实际替换发生在模板或数据源中,样本与执行对象不一致。这种情况下,反例样本通过没有参考价值,需要回到数据源重新取样。
假设某站点准备把正文中所有“联系方式”替换为“联系渠道”,规则为纯文本匹配。反例样本包括:导航栏中的“联系方式”链接锚文本、页脚中的“联系方式”标题、以及一句“请通过页面底部的联系方式与我们沟通”。假设前两处预期保持不变,第三处预期被替换。
执行替换后,如果导航栏锚文本被替换,说明规则没有区分正文与导航区域,下一步应把替换范围限制在正文容器内,而不是继续执行全站替换。如果第三处未被替换,说明匹配规则遗漏了该写法,下一步应检查该句是否位于脚本或特殊标签内。这两种结果指向不同的修正动作,不能混为一谈。
拿到反例样本的执行结果后,按以下顺序处理:
需要提醒的是,替换前后如果间隔较久,页面本身的搜索需求、季节因素或数据采集口径可能发生变化,不能把替换前后的流量差异直接归因于这次文本改动。反例样本解决的是“改得对不对”,不解决“改完效果好不好”。先把前者核对清楚,再谈后者。