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

帮助:解析函数/rpos

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

rpos是一个解析函数。帮助:解析函数页列出了所有解析函数的说明。

rpos

返回字符串中目标子串的最后出现位置。出自扩展 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.”

从0开始计数,未找到时返回-1。

语法

{{#rpos: 字符串 | 搜索目标 }}

  • 字符串:被搜索的文本
  • 搜索目标:要查找的子串(空字符串将自动转换为空格)

特性

  • 从右向左搜索
  • 区分大小写
  • 支持UTF-8多字节字符
  • 对<nowiki>标签等扩展标记按长度0处理
  • 搜索目标长度受$wgStringFunctionsLimitSearch配置限制

示例

  • {{#rpos: 这是长字串 | 字串 }} → 3
  • {{#rpos: 这是长字串长 | 长 }} → 5
  • {{#rpos: Žmržlina | lina }} → 4
  • {{#rpos: <nowiki>test</nowiki> | test }} → -1
  • {{#rpos: 测试文本 | 无匹配 }} → -1

底层代码

来自MediaWiki及其扩展的源代码,运行在服务端。此处仅供快速查阅,便于更充分的挖掘其“特性”。

/** mediawiki-1.37.0\extensions\ParserFunctions\includes\ParserFunctions.php
 * {{#rpos: string | needle}}
 *
 * Finds last occurrence of "needle" in "string".
 *
 * Note: If the needle is an empty string, single space is used instead.
 * Note: If the needle is not found, -1 is returned.
 * @param Parser $parser
 * @param string $inStr
 * @param int|string $inNeedle
 * @return int|string
 */
public static function runRPos( Parser $parser, $inStr = '', $inNeedle = '' ) {
	$inStr = $parser->killMarkers( (string)$inStr );
	$inNeedle = $parser->killMarkers( (string)$inNeedle );

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

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

	$pos = mb_strrpos( $inStr, $inNeedle );
	if ( $pos === false ) {
		$pos = -1;
	}

	return $pos;
}

实际用例

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