如何高效拆分两个字符串并生成所有值的组合(MediaWiki模板)
高效实现MediaWiki模板中多参数值的全组合分类生成
问题场景
我在MediaWiki模板里有两个参数location和locality_subjects,每个参数都支持多个用分号分隔的值,示例如下:
|location=Bucks County, Pennsylvania;Chester County, Pennsylvania |locality_subjects=Court records;Probate records;Vital records
需要为这两个参数的所有值组合生成分类链接,预期输出如下:
[[Category:Bucks County, Pennsylvania, court records]] [[Category:Bucks County, Pennsylvania, probate records]] [[Category:Bucks County, Pennsylvania, vital records]] [[Category:Chester County, Pennsylvania, court records]] [[Category:Chester County, Pennsylvania, probate records]] [[Category:Chester County, Pennsylvania, vital records]]
目前我假设每个参数最多包含4个值,用硬编码的方式逐个写出所有组合,代码非常冗余:
[[Category:{{#explode:{{{location|}}}|;|0}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|0}}]] [[Category:{{#explode:{{{location|}}}|;|0}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|1}}]] [[Category:{{#explode:{{{location|}}}|;|0}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|2}}]] [[Category:{{#explode:{{{location|}}}|;|0}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|3}}]] [[Category:{{#explode:{{{location|}}}|;|1}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|0}}]] [[Category:{{#explode:{{{location|}}}|;|1}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|1}}]] [[Category:{{#explode:{{{location|}}}|;|1}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|2}}]] [[Category:{{#explode:{{{location|}}}|;|1}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|3}}]] [[Category:{{#explode:{{{location|}}}|;|2}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|0}}]] [[Category:{{#explode:{{{location|}}}|;|2}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|1}}]] [[Category:{{#explode:{{{location|}}}|;|2}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|2}}]] [[Category:{{#explode:{{{location|}}}|;|2}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|3}}]] [[Category:{{#explode:{{{location|}}}|;|3}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|0}}]] [[Category:{{#explode:{{{location|}}}|;|3}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|1}}]] [[Category:{{#explode:{{{location|}}}|;|3}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|2}}]] [[Category:{{#explode:{{{location|}}}|;|3}}, {{#explode:{{lc:{{{locality_subjects|}}}|;|3}}]]
想问有没有更高效的实现方式?
高效实现方案
可以利用MediaWiki的ParserFunctions扩展提供的#arraymap函数,实现自动遍历两个参数的所有值并生成组合分类,代码如下:
{{#arraymap:{{{location|}}}|;|$loc| {{#arraymap:{{lc:{{{locality_subjects|}}}}}|;|$subj| [[Category:$loc, $subj]] }} }}
代码说明
- 外层
#arraymap:将location参数按分号;拆分为数组,把每个元素赋值给变量$loc - 内层
#arraymap:将转小写后的locality_subjects参数按分号拆分,把每个元素赋值给变量$subj - 内层自动生成
[[Category:$loc, $subj]]格式的分类链接,最终输出所有值的组合
优势
- 无需硬编码值的数量,自动适配任意数量的分号分隔值(只要参数格式正确)
- 代码简洁易维护,避免冗余的重复代码
- 保留了原实现中
{{lc:...}}转小写的逻辑,和预期输出一致
注意:确保你的MediaWiki站点已安装并启用了ParserFunctions扩展(绝大多数维基站点默认已配置)
内容的提问来源于stack exchange,提问作者redheadkelly
相关产品推荐
相关产品推荐

