Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mediawiki解析器和recursiveTagParse_Php_Mediawiki - Fatal编程技术网

Php Mediawiki解析器和recursiveTagParse

Php Mediawiki解析器和recursiveTagParse,php,mediawiki,Php,Mediawiki,我在hook中呈现wikitext以进行标记处理时遇到问题 public static function onTagRender( $input, array $args, $parser, $frame ) { ... $text = $parser->recursiveTagParse($sometext, $frame); ... return $text; } 如果$sometext包含例如 "Example from page [[XYZ]]" 然后我希望返回的$text应该

我在hook中呈现wikitext以进行标记处理时遇到问题

public static function onTagRender( $input, array $args, $parser, $frame ) {
...
$text = $parser->recursiveTagParse($sometext, $frame);
...
return $text;
}
如果$sometext包含例如

"Example from page [[XYZ]]"
然后我希望返回的$text应该包含

"Example from page <a href="/wiki/XYZ" title="XYZ">XYZ</a>"
“来自页面的示例”
但我只有

"Example from page <!--LINK 0:0-->"
“来自页面的示例”

我也尝试过$parser->replaceInternalLinks(),但结果相同。我忽略了什么?

解析器::recursiveTagParse只做部分呈现,好的。这可能是问题所在,也可能不是问题所在。要完全呈现任何用户输入,必须创建解析器函数()而不是标记函数


请参见解析器::recursiveTagParse仅执行部分呈现,afaik。这可能是问题所在,也可能不是问题所在。要完全呈现任何用户输入,必须创建解析器函数()而不是标记函数


请参阅

如果有些人遇到相同的问题,请尝试在
递归标记解析
之后调用
替换链接持有者
。(我没有同样的问题,所以我没有测试它。)

所以在OP的代码片段中,应该是:

public static function onTagRender( $input, array $args, $parser, $frame ) {
...
$text = $parser->recursiveTagParse($sometext, $frame);
$text = $parser->replaceLinkHolders($text);
...
return $text;
}
根据我的理解解释:

实际上,通常的
parse
方法调用
internalParse
方法,该方法完成大部分工作,然后执行其他一些操作。另一方面,
recursiveTagParse
几乎只调用
internalParse
,因此它不执行
parse
中的其他内容
问题是,链接分两步解析:

  • 链接首先被提取到
    LinkHolderArray
    中,并在文本中替换为

    (这是由
    replaceInternalLinks
    完成的,由
    internalParse
    调用,所以这很好。)
  • 然后,
    标记被解析为HTML链接。
    (这是由
    replaceLinkHolder
    完成的,它由
    parse
    调用,而不是由
    internalParse
    调用,因此也不是由
    recursiveTagParse
    调用)

  • 如果有些人遇到同样的问题,请尝试在
    递归标记解析
    之后调用
    替换链接持有者
    。(我没有同样的问题,所以我没有测试它。)

    所以在OP的代码片段中,应该是:

    public static function onTagRender( $input, array $args, $parser, $frame ) {
    ...
    $text = $parser->recursiveTagParse($sometext, $frame);
    $text = $parser->replaceLinkHolders($text);
    ...
    return $text;
    }
    
    根据我的理解解释:

    实际上,通常的
    parse
    方法调用
    internalParse
    方法,该方法完成大部分工作,然后执行其他一些操作。另一方面,
    recursiveTagParse
    几乎只调用
    internalParse
    ,因此它不执行
    parse
    中的其他内容
    问题是,链接分两步解析:

  • 链接首先被提取到
    LinkHolderArray
    中,并在文本中替换为

    (这是由
    replaceInternalLinks
    完成的,由
    internalParse
    调用,所以这很好。)
  • 然后,
    标记被解析为HTML链接。
    (这是由
    replaceLinkHolder
    完成的,它由
    parse
    调用,而不是由
    internalParse
    调用,因此也不是由
    recursiveTagParse
    调用)