一段文本里混着好几种号码,勾上以后各档分别怎么变
起因很具体:贴进去的文本里 11、18、16 码元三种长度的串都有,五个勾选框全亮着,输出里每档各吃掉多少格。跑法:模板 7386 字节 / 152 行、脚本块 2853 码元原样执行,五条正则与 repeat、doMask 不改写、不修 bug,DOM 只给按 id 的桩,纯 Node。数字全是字符串层实测,长度按 UTF-16 码元;样本串要么是顺序位与连续重复位拼出的虚构输入,要么是模板自带的默认样本,与任何真实号码无关,本篇只把它们当字符串做算术。
被测的是隐私信息遮掩:默认输入是模板自带的 4 行 / 108 码元样本,加载即跑一次 doMask(L150),没有按钮触发。
星号枚数是写死的常数,跟输入长度无关
五条替换式里 repeat 的上界全是字面量,调用点 6 处、常数依次 4、3、11、4、4、4(L98 / L106 / L114 / L124),IP 档(L132)不走 repeat 而是直接拼 2 枚。
| 档 | 星号枚数 | 替换式形态 | 外露比例 |
|---|---|---|---|
| 手机 | 4 | 头 3 + 4 枚 + 尾 4 | 63.6% |
| 邮箱 | 3 | 首字符 + 3 枚 | 25.0% |
| 证件 | 11 | 头 3 + 11 枚 + 尾 4 | 38.9% |
| 卡号 | 12 | 三段各 4 枚加空格 | 21.1% |
| IP | 2 | 留前两段重拼 | 54.5% |
同一档内输入变长变短都不改这个数:卡档取 16、17、18、19 码元四档,星号恒 12、输出码元恒 19、外露数字恒 4;手机档从 11 码元加长到 30 码元,星号恒 4、命中恒 1 处;证件档只有 18 码元那档命中,星号恒 11。「比模板长」不是降级而是不接手——纯数字串 20..40 码元在五档全勾下 0 命中、外露 100.0%。
图 1:五档常数的恒定读数。
输入比模板短,既不落进掩码也不落进重叠
重叠那一档:head 取 3、tail 取 4,命中串短于 3+4 = 7 码元时两段共享同一格、明文重复外露(假想表 n=6 得 123****3456,index 2 出现两次)。但三条用 slice 的正则拿不到这么短的命中串:手机的定长账是 1 枚字面加 1 枚字符类加 9 枚 = 11,证件 17+1 = 18,卡取 16..19,最小命中长度 11、18、16 分别比门槛 7 多 4、11、9 码元;400 条定向语料裸跑,「小于 7 的命中数」五档全为 0。另两档不切片,重叠外露在本页不可达。
外露来自不锚定:18 码元串被手机档抢走
证件、卡、IP 三条带 \b,手机与邮箱不带,差别就在第 2 行:实测输出 身份证号:110101199****11234,星号 4 枚、14 个数字码元留着,占 18 码元的 77.8%——手机档没有边界锚,先在证件串的 18 码元内部命中一次,把证件档要读的输入换掉;单独关掉手机档才得到 110***********1234、星号 11、外露 7。统计栏数字列 4、2、1、1 里没有「身份证」行:证件档在自家首屏完全空转,「关掉 idcard」与五档全勾的输出首个差异位置是 -1,32 种勾选组合只产出 24 种串,8 组冗余全来自这一档。
五条 replace 顺序固定,残段决定第二档能不能接手
链路是手机 → 邮箱 → 证件 → 卡 → IP,前一条的输出就是后一条的输入。手机档切完后尾 4 码元与其后数字相连,卡档接手看「4 加残留」是否落在 16..19。输入 24 码元的 138123456781234567890123 → 手机先切、卡档在残段命中长度 17 → 星号 16;加长到 27 码元时残段 20 大于 19,卡档 0 命中。邮箱档同理:local 混进一枚 11 码元数字段(整行 31 码元)→ 手机先切、邮箱再接手 → 星号 7,比只勾邮箱档差 15 码元。
图 2:串接顺序与残段接手窗口。
遮掩字符框的三处口径
框上写着 value="*" 与 maxlength="1"(L35),取值句子(L84)的回落只对空串生效。把框清空,13812345678 仍出 138****5678、4 枚星号,与默认逐字相同;打一个空格则空格 truthy、不回落,11 码元里 4 码元是空格、星号 0。桩里强写两字符,repeat 产出 8 码元、手机档输出 15 码元。连打两个字符会不会被截成一格、预设按钮写入是否同受约束,属浏览器控件层,本批纯 Node 没起 headless Chrome,标未实测。
统计栏数的是命中处数
五个计数器只在各 replace 回调里自增,总数取五数之和(L139),命中 0 的档整行不渲染。1 行 3 个手机号是 3 处 / 12 枚星号、仍 1 行;100 行重复样本给 200 处而行数只有 100;空输入走提前返回,统计栏写成 0 码元而不是「0 处」。把结果粘回去再遮一轮:第 1 轮从 108 变 104 码元,第 2 轮输出与输入逐字相等、星号仍 23。
IP 档默认没勾,文案却把它和前四档并列
逐字读属性:前四个 input 带 checked(L18 / L21 / L24 / L27),mask-ip(L30)没有——默认首屏第 4 行与输入逐字相等、星号 0;勾上以后 13 码元变 11 码元、2 枚星号,星号账从 23 涨到 25。页面配置 16 项里可判 15 项:[一致] 8、[部分一致] 5、[冲突] 2,一处在「中间 11 位遮掩」那句整页断言(首屏证件档命中 0 次,差 7 枚星号),一处在把默认未勾的 IP 写成自动识别。
命中这件事,两个页各有一把尺
本页只替换不挑选,判据是五条正则的命中处数;按类型挑字段是文本信息提取那一页的活,两页口径不是同一把尺。内置类型在提取侧撞上限那件事,站内旧文量过,不复述它的数字。
常见问题
Q:星号枚数会随输入长度变吗?
不会——卡档输入从 16 到 19 码元,星号恒 12、输出码元恒 19;手机档从 11 到 30 码元,星号恒 4。
Q:短于 7 码元的串会把明文重复露出来吗?
算术上会,n=6 时 head 与 tail 共享 index 2 那一枚;但三条切片的正则最小命中 11、18、16 够不到门槛,实测重叠在本页不可达。
Q:勾了证件档,统计里为什么没有身份证那一行?
18 码元串被排在前面的手机档改写,证件档拿到已含遮掩字符的中间串,命中 0 次的档整行不渲染。