构造反例样本的目的,是在批量替换之前先找出“替换后会变错”的文本形态,而不是证明替换规则正确。做法是从页面里抽取少量真实片段,按同义表达、标点变体、嵌套结构、属性值等维度分层,再逐条人工判断替换后是否仍成立。如果反例命中率明显高于普通样本,说明规则还没到可以批量执行的程度,应先收窄匹配条件;如果反例几乎不命中,才进入小范围试跑。
反例样本的规模不是固定的,取决于替换规则的作用范围。当替换目标是一个词或一个短语,且只出现在正文段落里时,样本可以小而精:从待处理页面中抽二十到三十个片段,其中一半来自标题、列表、表格等特殊位置,逐个核对替换后的语义。当替换目标可能出现在标签属性、内链锚文本、结构化数据或脚本片段中时,样本必须覆盖这些位置,否则反例会漏掉整类风险。
判断属于哪种条件的依据,是替换动作是否只作用于可见文本。只作用于可见文本的替换,风险集中在语义和标点;会波及属性值或代码片段的替换,风险集中在功能破坏。前者可以用人工阅读判断,后者需要把匹配结果和上下文一起看,必要时用浏览器控制台检查替换后的页面是否仍能正常渲染。
抽样时不要只按页面随机抽,而要按文本形态分层,这样反例才有区分力。
class、href、alt 或脚本变量中时,抽出的片段要包含这些位置,确认替换是否只作用于可见文本。这四类里,前两类决定语义是否正确,后两类决定页面是否还能正常工作。两类问题需要分开记录,不要混在一张清单里判断。
多个角色对同一事实有不同理解时,反例样本是很好的对齐工具。编辑认为某句话替换后更通顺,运营认为替换后改变了原意,开发认为替换会碰到属性值——这些分歧都可以转成一条条可核对的项目:写出原始片段、写出替换后的片段、标注判断依据(语义、标点、标签结构、功能),再让各方对同一条记录给出“通过/不通过”。
具体动作是:先建一张反例记录表,每条记录包含片段来源、原始文本、替换后文本、判断结论、判断理由。然后逐条核对,而不是整批讨论。核对结果会直接影响下一步:如果某类反例集中不通过,说明匹配规则需要加边界条件;如果只是个别片段不通过,可以加入例外清单,在批量执行时跳过这些片段。
假设要把页面中所有“立即咨询”替换为“免费咨询”,且这些文字大多出现在按钮或链接里。抽样时如果只抽正文段落,反例命中率可能很低,看起来规则安全;但如果抽出的片段包含 <a href="/contact">立即咨询</a> 这类结构,替换后链接文字变了,锚文本与目标页面的相关性也随之改变,这就属于需要单独判断的反例。
处理方式是:先确认替换是否只针对可见文字,再决定要不要保留锚文本原样。如果保留,就在规则里排除链接内部文本;如果不保留,就把锚文本变化记入反例清单,并评估它对页面主题表达的影响。这个例子说明,反例的价值不在于数量多,而在于它能暴露规则在哪些条件下不成立。
小范围试跑后,把替换前后的页面片段再抽一次,和反例清单对比。如果新出现的错误形态不在原清单里,说明分层抽样有遗漏,需要补充样本再判断;如果错误都落在已记录的反例类型里,说明清单基本可用,可以按例外规则扩大执行范围。
比较时要考虑时间因素:一次改动前后的数据差异,可能来自季节变化、搜索需求波动或数据采集口径不同,不能单独归因于替换动作。因此反例核对应以文本和结构判断为主,数据只作为辅助参考。只有当替换确实改变了页面内容或链接关系时,才需要结合后续表现进一步观察。