测试用例(正确时返回空值,错误时返回分类:Bilibili视频ID错误):
id=114514
→id=1145141919810
→id=0114514
→错误(起始位为0)id=av114514
→id=AV114514
→id=av1145141919810
→id=av0114514
→错误(纯数字部分起始位为0)id=bV1XX4X1X7XX
→id=bV1Il1O0fbqc
→错误(含有小写字母l、大写字母I、大写字母O和数字0)id=bV1z?wsmphxg
→错误(含有非大小写字母和数字的字符)id=bV1xxapi
→错误(长度不对)id=1XX4X1X7XX
→id=1Il1O0fbqc
→错误(含有小写字母l、大写字母I、大写字母O和数字0)id=1z?wsmphxg
→错误(含有非大小写字母和数字的字符)id=1xxapi
→错误(长度不对)id=XX4X1X7XX
→id=1X4X1X7XX
→(正确,避免出现1开头的9位id被错认为带有前缀1的10位格式的错误)id=Il1O0fbqc
→错误(含有小写字母l、大写字母I、大写字母O和数字0)id=z?wsmphxg
→错误(含有非大小写字母和数字的字符)id=xxapi
→错误(长度不对)return { validation = function(frame) local flag = false local id = mw.text.trim(frame.args.id or "") local regex = "[A-HJ-NP-Za-km-z1-9]+$" -- 1. 有明确的 av 前缀且符合 aid 规则 if mw.ustring.match(id, "^[Aa][Vv][1-9]%d*$") then flag = true -- 2. 有明确的 bv 前缀且符合 bvid 规则 elseif string.len(id) == 12 and mw.ustring.match(id, "^[bB][vV]1" .. regex) then flag = true -- 3. 没有明确的前缀,但符合 aid 规则 elseif mw.ustring.match(id, "^[1-9]%d*$") then flag = true -- 4. 没有明确的前缀,但符合 bvid 规则且不符合 aid 规则 elseif string.len(id) == 10 and mw.ustring.match(id, "^1" .. regex) or string.len(id) == 9 and mw.ustring.match(id, "^" .. regex) then flag = true -- 5. 无法判断 end if flag then return "" else return frame.args.result or frame:expandTemplate { title = "ArticleCategory", args = { "Bilibili视频ID错误", }, } .. '<strong class="error BilibiliVideoIDValidatorArgument" style="display:none">' .. frame.args.id .. "</strong>" end end, }