• Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

Module:BilibiliVideoIDValidator

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索
Template-info.svg 模块文档  [查看] [编辑] [历史] [刷新]

测试用例(正确时返回空值,错误时返回分类:Bilibili视频ID错误):

  1. 若id为纯数字时,当首位不为0时合法:
    • id=114514
    • id=1145141919810
    • id=0114514错误(起始位为0)
  2. 若id为【av+纯数字】(不区分大小写,下同)时,当且仅当纯数字部分首位不为0时合法:
    • id=av114514
    • id=AV114514
    • id=av1145141919810
    • id=av0114514错误(纯数字部分起始位为0)
  3. 若id为【BV1】开头时,当且仅当id长度为12位,且除去【BV1】后的部分在仅包含大小写字母和数字的前提下均不包含小写字母l(L的小写)、大写字母I(i的大写)、大写字母O(o的大写)和数字0时合法:
    • id=bV1XX4X1X7XX
    • id=bV1Il1O0fbqc错误(含有小写字母l、大写字母I、大写字母O和数字0)
    • id=bV1z?wsmphxg错误(含有非大小写字母和数字的字符)
    • id=bV1xxapi错误(长度不对)
  4. 若id为【1】开头时,当且仅当id长度为10位,且除去【1】后的部分在仅包含大小写字母和数字的前提下均不包含小写字母l(L的小写)、大写字母I(i的大写)、大写字母O(o的大写)和数字0时合法:
    • id=1XX4X1X7XX
    • id=1Il1O0fbqc错误(含有小写字母l、大写字母I、大写字母O和数字0)
    • id=1z?wsmphxg错误(含有非大小写字母和数字的字符)
    • id=1xxapi错误(长度不对)
  5. 若id不满足上述四种情况时,当且仅当id长度为9位,且在仅包含大小写字母和数字的前提下均不包含小写字母l(L的小写)、大写字母I(i的大写)、大写字母O(o的大写)和数字0时合法:
    • 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,
}