Tools 是非官方社区Wiki。社区文档正在编写中,欢迎参与。 Wiki编辑答疑群:717421103
版本250722.2
全站通知:

帮助:解析函数/explode

来自WIKI实验室WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

explode

分割字符串。出自扩展 ParserFunctions 的String functions大规模使用时性能低下,推荐使用Lua模块。请参考扩展置顶警告MediaWiki代码库 r51497中的暴论“parsers in the ugliest, most inefficient programming language known to man: MediaWiki wikitext with ParserFunctions.”、“WARNING: enabling this may have an adverse impact on the sanity of your users.”

使用指定分隔符将字符串分割成多段,并返回指定位置的分割结果。如果指定位置超过分割后的数量,返回空字符串。

语法

{{#explode:文本 | 分隔符 | 位置索引 | 限制 }}

  • 文本:要分割的字符串。
  • 分隔符:用于分割字符串的分隔符。
  • 位置索引:要返回的分割结果的位置索引。从0开始,可以是正数或负数,负数表示从末尾开始计数。
  • 限制(可选):分割的最大数量。

示例

  • {{#explode:apple,banana,cherry | , | 1}}banana
  • {{#explode:one two three four | | -1}}four
    • 空格分隔,位置索引 -1,得到最后一个分割 'four'。
  • {{#explode:alpha-beta-gamma | - | 2}}gamma
  • {{#explode:aaa bbb ccc ddd eee| |2|3}}ccc ddd eee

底层代码

/** mediawiki-extensions-ParserFunctions-REL1_37\includes\ParserFunctions.php
 * {{#explode:string | delimiter | position | limit}}
 *
 * Breaks "string" into chunks separated by "delimiter" and returns the
 * chunk identified by "position".
 *
 * Note: Negative position can be used to specify tokens from the end.
 * Note: If the divider is an empty string, single space is used instead.
 * Note: Empty string is returned if there are not enough exploded chunks.
 *
 * @param Parser $parser 
 * @param string $inStr
 * @param string $inDiv
 * @param int $inPos
 * @param int|null $inLim
 * @return string
 */
public static function runExplode(
    Parser $parser, $inStr = '', $inDiv = '', $inPos = 0, $inLim = null
) {
    $inStr = $parser->killMarkers( (string)$inStr );
    $inDiv = $parser->killMarkers( (string)$inDiv );

    if ( $inDiv === '' ) {
        $inDiv = ' ';
    }

    if ( !self::checkLength( $inStr ) ||
        !self::checkLength( $inDiv ) ) {
        return self::tooLongError();
    }

    $inDiv = preg_quote( $inDiv, '/' );

    $matches = preg_split( '/' . $inDiv . '/u', $inStr, $inLim );

    if ( $inPos >= 0 && isset( $matches[$inPos] ) ) {
        $result = $matches[$inPos];
    } elseif ( $inPos < 0 && isset( $matches[count( $matches ) + $inPos] ) ) {
        $result = $matches[count( $matches ) + $inPos];
    } else {
        $result = '';
    }

    return $result;
}
代码逻辑:
  • 首先,去除输入字符串和分隔符中的标记。
  • 如果分隔符为空字符串,默认使用单个空格。
  • 检查输入字符串和分隔符的长度是否符合要求,若过长则返回错误信息。
  • 使用正则表达式根据分隔符分割字符串,最多分割为指定的限制数量。
  • 根据 position 参数返回对应的分割结果,支持正向和反向索引。
  • 如果指定的位置不存在,则返回空字符串。

实际用例

一些Wiki使用了相关特性,如下所示这个静态列表可能在下列页面更改后过时仅供批判性参考
碧蓝航线 - blhx

原神 - ys

明日方舟 - arknights

恋与深空 - lysk

崩坏:星穹铁道 - sr

代号鸢 - yuan

坎特伯雷公主与骑士唤醒冠军之剑的奇幻冒险 - gt

三国杀 - sgs

尘白禁区 - sonw

黑神话:悟空 - wukong

WIKI实验室 - tools

卡拉彼丘 - klbq

白荆回廊 - bjhl

赛尔计划 - seerplan

幻塔 - ht

雷索纳斯 - resonance

绝区零 - zzz

重返未来:1999 - reverse1999

公主连结 - pcr

ミナシゴノシゴト - mnsg

无期迷途 - wqmt

奇迹暖暖 - qjnn

地下城堡3 - dxcb3

鸣潮 - wutheringwaves

交错战线 - crosscore

千年之旅 - elf

世界之外 - world

梦幻模拟战 - langrisser

StardewValley星露谷物语 - stardewvalley

觅长生 - mcs

QQ飞车手游 - qqspeed

方舟指令 - fzzl

偶像荣耀/idoly pride - idolypride

深空之眼 - dhmmr

三国杀OL - sgsol

克鲁赛德战记 - cq

艾尔登法环 - eldenring

铃兰之剑 - llzj

三国杀移动版 - msgs

天地劫 - tdj

怪物弹珠 - gwdz

忘却前夜 - morimens

江南百景图 - jiangnan

食物语-档案馆 - swy

阴阳师妖怪屋 - yysygw

魔法使的约定 - mahoyaku

缺氧 - oni

神甲奇兵 - m2cn

胜利女神NIKKE - nikke

灵魂潮汐 - lhcx