在博客上做批量替换之前,先构造一批“必须不被替换”的反例样本,比直接全站替换更稳。反例样本要覆盖三类内容:已经被正确处理的旧文本、结构相似但语义不同的干扰文本、以及替换后可能产生新歧义的边界文本。把这三类写成可逐条核对的清单,再决定用正则、脚本还是手工处理。
假设你手里的博客有 40 篇教程,需要把正文中的“点击这里”统一替换为带具体动作的链接文字。这时反例样本不是随便找几段文字,而是要和替换规则一一对应。比如:
<a href="#">点击这里</a>,如果直接替换会破坏示例代码。先列出这三类,再决定替换范围。如果反例集中在代码块和图片说明,就应把替换限定在正文段落,而不是全字段执行。
一种做法是先随机抽 10 篇博客,从里面挑出疑似不该被替换的句子,再归纳规则。另一种做法是先写出替换规则,再按规则反向构造反例样本。两者都成立,但适用条件不同。
先抽样适合你还不清楚博客里有哪些写法的情况。代价是样本可能漏掉低频但危险的模式,比如只在两篇文章里出现的代码片段。动作上,可以按发布时间或栏目各抽 3 篇,逐篇标记“可替换”和“不可替换”的句子,再把不可替换的句子按共同特征分组。如果分组后发现有 4 组以上,说明替换规则需要分步执行,不能一次完成。
先写规则适合你已经明确要替换的文本模式,比如所有“本文”“本站”“点击这里”。这时反例样本要围绕规则边界来构造:规则写“替换所有‘本文’”,反例就要包括“本文档”“本文集”这类包含关系。动作上,先把规则写成一条可执行的匹配表达式,再用它去匹配全部文章,把命中结果里明显不该改的句子单独存档。如果命中结果中超过三成需要排除,说明规则过宽,下一步应先收窄规则,而不是继续增加反例。
假设你的博客里有一句“本文介绍如何创建博客,本文不涉及插件配置”。你打算把“本文”替换为“这篇教程”。构造反例时,至少准备以下四条:
本文 不应被替换,因为它是示例文本。把这四条放进一份临时清单,逐条对照替换结果。如果第 1、2 条被误替换,说明匹配边界需要加限定条件;如果第 4 条被误替换,说明替换范围没有排除代码块。这个动作的结果直接决定下一步:是调整匹配规则,还是调整处理范围。只有反例全部通过,才值得扩大到全部文章。
批量替换执行后,不要只看替换了多少处。把替换前的反例样本再跑一遍,确认它们没有被改动。同时,抽 5 篇被替换的文章,人工检查替换位置前后各一句话,看是否出现新的歧义。这里要区分两种现象:替换数量为零,可能是规则写错,也可能是原文本来就没有匹配项;替换后某篇文章流量变化,可能与替换无关,而是季节、搜索需求变化或采集时间差异造成的。不要把一次替换前后的数据直接当成因果关系。
如果反例样本在替换后仍然成立,并且抽查没有发现新歧义,就可以把这次的反例清单保存下来,作为下一次修改博客时的起点。下一次遇到新的替换需求,先往这份清单里补充边界样本,再决定是否执行。